python|python爬虫学习28

python爬虫学习28 今天继续学Xpath
上接上篇

目录

    • python爬虫学习28
      • 五、Xpath的使用其三
        • 5-8 文本获取
        • 5-9 属性获取
        • 5-10 属性多值匹配

五、Xpath的使用其三
照例把规则附上:
python|python爬虫学习28
文章图片

5-8 文本获取 昨天很厚道的挖了个坑,就将在5-8处被填上,我们可以使用text()方法来获取节点下的文本:
昨天我们截取的html文本如下:
python|python爬虫学习28
文章图片

当时我们成功匹配了属性clas为li的li节点:
python|python爬虫学习28
文章图片

那么如何检验呢?
# 获取文本from lxml import etreehtml = etree.parse('./python.html', etree.HTMLParser()) result = html.xpath('//li[@class="li"]//text()') print(result)

运行结果:节点中所有的文本都会以一个列表的形式被返回
python|python爬虫学习28
文章图片

哎嘿,这不就检验出来了吗
在学会使用text()之后,请大家思考以下情况的结果
result = html.xpath('//li[@class="li"]/text()')

from lxml import etreehtml = etree.parse('./python.html', etree.HTMLParser()) result = html.xpath('//li[@class="li"]/text()') print(result)

运行结果:
python|python爬虫学习28
文章图片

/的含义为选取直接子节点,可以发现此种情况只选取了li节点节点内的文本,而li节点的子节点中的文本并没有被匹配。
5-9 属性获取 对于获取一个节点的属性,在之前我们学习属性匹配的时候已经有涉及到了,我们可以使用@来定位一个属性并使之输出:
# 获取属性from lxml import etreehtml = etree.parse('./python.html', etree.HTMLParser()) # 这里的含义为匹配所有li节点下所有a节点的herf属性 # 获取属性与匹配属性的不同之处在于 获取属性时不用加 [] result = html.xpath('//li//a/@href') print(result)

运行结果:所有的匹配结果将存放到一个列表中返回给我们
python|python爬虫学习28
文章图片

5-10 属性多值匹配 首先请大家区分属性匹配与属性获取的区别。然后有的节点的某个属性可能会有两个值,这个时候:
python|python爬虫学习28
文章图片

加入我们稍稍修改一下第一个li节点的属性,然后进行常规属性的匹配:
from lxml import etreehtml = etree.parse('./python.html', etree.HTMLParser()) result = html.xpath('//li[@class="li"]') print(result)

运行结果:很显然只能匹配到两个
python|python爬虫学习28
文章图片

但这时你可能有点不服,尝试补全属性挣扎一波:
from lxml import etreehtml = etree.parse('./python.html', etree.HTMLParser()) result = html.xpath('//li li-first[@class="li"]') print(result)

运行结果:发现竟然是一种非法表达
python|python爬虫学习28
文章图片

那么这个时候,我们就得使用contains方法进行匹配:
from lxml import etreehtml = etree.parse('./python.html', etree.HTMLParser()) # 该处意为 属性中含有 “li” 即返回一个结果 result = html.xpath('//li[contains(@class, "li")]') print(result)

运行结果:
python|python爬虫学习28
文章图片

【python|python爬虫学习28】今日结束,明日继续!

    推荐阅读