vs怎么定位html类选择器,css选择器 Vs. xpath选择器 Vs.正则表达式

a4c26d1e5885305701be709a3d33442f.png

用Python写网络爬虫第2章最后介绍了把抓取结果保存到csv表格中的方法

a4c26d1e5885305701be709a3d33442f.png

分析网页源码发现,数据都是在 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())

完美取出

a4c26d1e5885305701be709a3d33442f.png

当时我认为用正则表达式也行,于是换了个方式取

a4c26d1e5885305701be709a3d33442f.png

结果却是这样的

a4c26d1e5885305701be709a3d33442f.png

初看还行,但是某些格子里夹杂了不少html代码,再仔细分析原来某些网页的 td

class="w2p_fw"下的内容并不是简单的数据,而是嵌套了不少标签,而且每一页的情况都不相同,用正则表达式似乎不大可能完美取出(也许我目前水平不够,但是感觉做起来十分的复杂)a4c26d1e5885305701be709a3d33442f.png

于是换了第3种方法

xpath

tree.xpath('//table/tr[@id="places_{}__row"]/td[@class="w2p_fw"]'.format(field))[0].text_content()

嵌套标签的问题解决,得到了css选择器同样的效果

a4c26d1e5885305701be709a3d33442f.png

貌似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写网络爬虫这本书别看书这么薄,字这么大,里面小坑大坑无数,有的是版本差异,有的需要狂补知识点,而且源码和书中写的也是不大一样,真的不大适合初学者,既然勉强过了两章,再试试看吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值