用Python写网络爬虫第2章最后介绍了把抓取结果保存到csv表格中的方法
分析网页源码发现,数据都是在 tr id="places_???_row" 下的 td class="w2p_fw"
中,于是先把???中固定内容建立一个列表
fields = ('area', 'population', 'iso', 'country', 'capital',
'continent', 'tld', 'currency_code', 'currency_name', 'phone',
'postal_code_format', 'postal_code_regex', 'languages',
'neighbours')
然后通过for循环,把fields中的值一个个放入选择器,取出所对应的数据.
书中使用css选择器筛选需要的数据
tree.cssselect('table > tr#places_{}__row >
td.w2p_fw'.format(field))[0].text_content())
完美取出
当时我认为用正则表达式也行,于是换了个方式取
结果却是这样的
初看还行,但是某些格子里夹杂了不少html代码,再仔细分析原来某些网页的 td
class="w2p_fw"下的内容并不是简单的数据,而是嵌套了不少标签,而且每一页的情况都不相同,用正则表达式似乎不大可能完美取出(也许我目前水平不够,但是感觉做起来十分的复杂)
于是换了第3种方法
xpath
tree.xpath('//table/tr[@id="places_{}__row"]/td[@class="w2p_fw"]'.format(field))[0].text_content()
嵌套标签的问题解决,得到了css选择器同样的效果
貌似css选择器写法更简洁一些,xpath也不赖,本来以为学好正则表达式就可以了,没想到.......
再填个坑,一开始数据导入csv中发现一行数据接着一行空行,查了下资料python2和3有不同的处理方法。
Python2,以二进制wb的方式写入即可。
writefile =
open('result.csv','wb')
writer =
csv.writer(writefile)
然而Python3使用上述方式会报错:TypeError: 'str' does not support the buffer
interface
解决方法:
以w模式打开文件,添加参数newline=''
书中是在2的环境下用了w方式写入,它网站上的源码也是如此,又给我吃了点药
ps: 用Python写网络爬虫这本书别看书这么薄,字这么大,里面小坑大坑无数,有的是版本差异,有的需要狂补知识点,而且源码和书中写的也是不大一样,真的不大适合初学者,既然勉强过了两章,再试试看吧