python爬虫学习28

python爬虫学习28

今天继续学Xpath

上接上篇

目录

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

五、Xpath的使用其三

照例把规则附上:

python爬虫学习28_第1张图片

5-8 文本获取

昨天很厚道的挖了个坑,就将在5-8处被填上,我们可以使用text()方法来获取节点下的文本:

昨天我们截取的html文本如下:

python爬虫学习28_第2张图片

当时我们成功匹配了属性clas为li的li节点:

python爬虫学习28_第3张图片

那么如何检验呢?

# 获取文本

from lxml import etree

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

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

哎嘿,这不就检验出来了吗

在学会使用text()之后,请大家思考以下情况的结果

result = html.xpath('//li[@class="li"]/text()')
from lxml import etree

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

运行结果:

python爬虫学习28_第5张图片

/的含义为选取直接子节点,可以发现此种情况只选取了li节点节点内的文本,而li节点的子节点中的文本并没有被匹配。

5-9 属性获取

对于获取一个节点的属性,在之前我们学习属性匹配的时候已经有涉及到了,我们可以使用@来定位一个属性并使之输出:

# 获取属性

from lxml import etree

html = etree.parse('./python.html', etree.HTMLParser())
# 这里的含义为匹配所有li节点下所有a节点的herf属性
# 获取属性与匹配属性的不同之处在于 获取属性时不用加 []
result = html.xpath('//li//a/@href')
print(result)

运行结果:所有的匹配结果将存放到一个列表中返回给我们

在这里插入图片描述

5-10 属性多值匹配

首先请大家区分属性匹配与属性获取的区别。然后有的节点的某个属性可能会有两个值,这个时候:

python爬虫学习28_第6张图片

加入我们稍稍修改一下第一个li节点的属性,然后进行常规属性的匹配:


from lxml import etree

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

运行结果:很显然只能匹配到两个

python爬虫学习28_第7张图片

但这时你可能有点不服,尝试补全属性挣扎一波:

from lxml import etree

html = etree.parse('./python.html', etree.HTMLParser())
result = html.xpath('//li li-first[@class="li"]')
print(result)

运行结果:发现竟然是一种非法表达

python爬虫学习28_第8张图片

那么这个时候,我们就得使用contains方法进行匹配:

from lxml import etree

html = etree.parse('./python.html', etree.HTMLParser())
# 该处意为 属性中含有 “li” 即返回一个结果
result = html.xpath('//li[contains(@class, "li")]')
print(result)

运行结果:

python爬虫学习28_第9张图片

今日结束,明日继续!

你可能感兴趣的:(python,爬虫,学习)