人生苦短,我用 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)