Python urllib没法正确抓取表格的内容源码哪里有问题,pythonurllib,urllib获取到的内容
Python urllib没法正确抓取表格的内容源码哪里有问题,pythonurllib,urllib获取到的内容
urllib获取到的内容转为 BeautifulSoup bs4对象后内容发生变化
http://samsung-updates.com/device/?id=SM-N9007
这个网址用linux curl和直接用urllib获取到的内容都是正常的,主要关注 table id="flist" 节点的内容如下:
<table id="flist" border="0" width="100%" class="nosort"><tr><td class="sorttable_nosort" colspan="2" width="13%"><center><b>Device Name</b></center></td><td width="80" class="sorttable_nosort"><b><center>Model</center></b></td><td width="20"><b><center>Region</center></b></td><td align="center" class="sorttable_nosort"><b><center>Version</center></b></td><td align="center"><b><center>OS</center></b></td><td align="center" class="sorttable_nosort"><b><center>OS Version</center></b></td><td align="center"><b><center>Build Date</center></b></td><td align="center"><b><center>Changelist</center></b></td><td align="center" class="sorttable_nosort"><b><center>Unlock</center></a></td><td align="center" class="sorttable_nosort"><b><center> </center></b></td></tr><tr><td align="left" colspan="2">Galaxy Note 3 (Snapdragon/SM-N9007)</td><td align="center"><a href="http://samsung-updates.com/device/?id=SM-N9007&details=Galaxy_Note_3__Snapdragon_and_SM-N9007">SM-N9007</a></td><td align="center"><a href="http://samsung-updates.com/region/?region=TGY" class="tooltip">TGY<span><b>Hong kong</b></span></a></td><td align="center">N9007ZHU3ANG2</td><td align="center"><img src="http://live.samsung-updates.com/44.png" border="0" width="32" height="22" alt="Android" title="KitKat" /></td><td align="center">4.4.2</td><td align="center">10.07.2014</td><td align="center">2188588</td><td align="center"><a href="http://www.unlocksamsungonline.com/samsung-SM-N9007-unlock-codes/">Unlock</a></td><td align="center"> <a href="/details/31397/Galaxy_Note_3_Snapdragon/SM-N9007/SM-N9007/TGY/N9007ZHU3ANG2.html" title="Download from Hotfile Mirror"><img src="http://samsung-updates.com/dbut.png" alt="Download File" width="90" height="35" /></a></td></tr>
但如果将获取到的内容转成bs4对象,获取的内容就不对了。请参见以下代码:
import urllib.requestfrom bs4 import BeautifulSoupdef get_dom(page_url,encoding): opener = urllib.request.build_opener() opener.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11')] dom = opener.open(page_url) return dom.read().decode(encoding) dom.close()def get_post_content(post_url): soup_post = BeautifulSoup(get_dom(post_url,"utf-8")) print(soup_post)get_post_content("http://samsung-updates.com/device/?id=SM-N9007")
print出来的内容变成了:
<table border="0" class="nosort" id="flist" width="100%"><tr><td class="sorttable_nosort" colspan="2" width="13%"><center><b>Device Name</b></center></td><td class="sorttable_nosort" width="80"><b><center>Model</center></b></td><td width="20"><b><center>Region</center></b></td><td align="center" class="sorttable_nosort"><b><center>Version</center></b></td><td align="center"><b><center>OS</center></b></td><td align="center" class="sorttable_nosort"><b><center>OS Version</center></b></td><td align="center"><b><center>Build Date</center></b></td><td align="center"><b><center>Changelist</center></b></td><td align="center" class="sorttable_nosort"><b><center>Unlock</center></b></td></tr></table></div></div></div></div><td align="center" class="sorttable_nosort"><b><center> </center></b></td><tr><td align="left" colspan="2">Galaxy Note 3 (Snapdragon/SM-N9007)</td><td align="center"><a href="http://samsung-updates.com/device/?id=SM-N9007&details=Galaxy_Note_3__Snapdragon_and_SM-N9007">SM-N9007</a></td><td align="center"><a class="tooltip" href="http://samsung-updates.com/region/?region=TGY">TGY<span><b>Hong kong</b></span></a></td><td align="center">N9007ZHU3ANG2</td><td align="center"><img alt="Android" border="0" height="22" src="http://live.samsung-updates.com/44.png" title="KitKat" width="32"/></td><td align="center">4.4.2</td><td align="center">10.07.2014</td><td align="center">2188588</td><td align="center"><a href="http://www.unlocksamsungonline.com/samsung-SM-N9007-unlock-codes/">Unlock</a></td><td align="center"> <a href="/details/31397/Galaxy_Note_3_Snapdragon/SM-N9007/SM-N9007/TGY/N9007ZHU3ANG2.html" title="Download from Hotfile Mirror"><img alt="Download File" height="35" src="http://samsung-updates.com/dbut.png" width="90"/></a></td></tr>
请注意第一个tr节点后,table闭合了,还有有很多div闭合的标记。
这个问题导致我没法正确抓取表格的内容,求教下是不是我哪里有问题?
这是因为BeautifulSoup默认使用的HTML解析器(即标准库里的那个)对你的页面解析出错。解决方法是换一个解析器。
参见http://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
P.S. 我用Python3.4,装了html5lib,并且在代码里用BeautifulSoup(xxx, 'html5lib')可以正确获得你想要的东西。
再P.S. 现在比较流行的html解析库是PyQuery,因为它的语法跟jQuery很像,很容易上手。而http库一般用requests,也是因为它提供的api很简单
import requestsfrom pyquery import PyQuery as pqdef html(url): return requests.get(url).textdef table(text): return pq(text)('table#flist')def table_from_url(url): return pq(url=url)('table#flist')if __name__ == '__main__': print(table(html('http://samsung-updates.com/device/?id=SM-N9007'))) # or print(table_from_url('http://samsung-updates.com/device/?id=SM-N9007'))
入过这个坑!
就是解释器的问题。虽然bs官方推荐lxml解释器,但是它的最大缺点是,如果你的html源码本身有问题,比如一个
所以用html5lib绝对没问题。
pip install html5lib安装,然后实例化改成soup = BeautifulSoup(html, 'html5lib')就好了。
另外,bs4后,BeautifulSoup(html, 'html5lib')
编橙之家文章,
相关内容
- linux后台运行python脚本自动重启有什么好思路,linuxpy
- 如何实现python多线程更新修改数据项操作方法?,pytho
- Python源码在guess错误后没按照预设效果执行,pythongues
- 有哪些渗透工具是用python语言开发的?,渗透python,目前
- Python生成固定大小文件最高效方法,python生成大小,问,
- flask CSS文件'ascii' codec问题,flaskcodec,flask 版本使用0.
- JS是学习python爬虫必要了解的知识点吗,python爬虫,额
- 求指导django中one-to-many和foreign key的应用及用途,djang
- Python什么方法可以将XML转换为JSON格式,pythonjson,由于老
- Python mysql数据牗executemany指定写入表报错,pythonexecute
评论关闭