小白学 Python 爬虫(20):Xpath 进阶
人生苦短,我用 Python
前文传送门:
代码如下:
from lxml import etree import requests response = requests.get('upload/201912171126388304.png" style="margin: 0px; padding: 0px; border: 0px; max-width: 700px; height: auto;" alt="" />这时 Chrome 会自动帮我们把这个节点的表达式 copy 到当前的剪切板上,只需要我们在程序里 ctrl + v
一下。
属性获取
有些情况下,我们可能不止需要节点中的文本数据,可能还会需要节点中的属性数据,比如上面的示例,我们除了想知道文章标题,其实还想知道文章的跳转路径:
result_2 = html.xpath('/html/body/section/div/div/main/article[1]/div[2]/div/h3/a/@href') print(result_2)
结果如下:
['/2019/12/11/1468953802/']
这里需要注意的是,此处和属性匹配的方法不同,属性匹配是中括号加属性名和值来限定某个属性,如 [@class="container"]
,而此处的 @href
指的是获取节点的某个属性,二者需要做好区分。
属性多值匹配
某些时候吧,某些节点的某个属性可能有多个值,这个多见于 class
属性,由于某些编码习惯以及某些其他原因,这个属性经常性会出现多个值,这时如果只使用其中的一个值的话,就无法匹配了。

如果这么写的话:
result_3 = html.xpath('//div[@class="post-head"]') print(result_3)
结果如下:
[]
可以看到,这里没有匹配到任何节点,这时,我们可以使用一个函数:contains()
,上面的示例可以改成这样:
result_3 = html.xpath('//div[contains(@class, "post-head")]') print(result_3)
这样通过 contains()
方法,第一个参数传入属性名称,第二个参数传入属性值,只要此属性包含所传入的属性值,就可以进行匹配了。
多属性匹配
除了上面的一个属性有多个值的情况,还经常会出现需要使用多个属性才能确定一个唯一的节点。
这时,我们可以使用运算符来进行处理。

还是这个示例,我们获取 <img>
这个节点,如果只是使用 class 属性来进行获取,会获得很多个节点:
result_4 = html.xpath('//img[@class="img-ajax"]') print(result_4)