Python爬虫学习记录- XPath库的使用2

289 阅读2分钟

这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战

周末周末,终于脱离工作,不过一想到明天就是星期一,又要开始新的一周了.

上次学XPATH这个库学到,怎么找子节点,今天学习后面的内容.

属性匹配

选取节点的时候可以使用@符号实现属性过滤,比如要选取class属性为item-0的li标签的节点,可以这样实现: 之前的test.html文件如下:

<html><body><div>
    <ul>
        <li class="item-0"><a href="link1.html">first item</a></li>
        <li class="item-1"><a href="link2.html">first item</a></li>
        <li class="item-inactive"><a href="link3.html">first item</a></li>
        <li class="item-1"><a href="link4.html">first item</a></li>
        <li class="item-0"><a href="link5.html">first item</a>
    </li></ul>
</div>
</body></html>

我们使用如下代码,就可以获得li标签,且属性名是item-0

from lxml import etree

html = etree.parse('./test.html',etree.HTMLParser())
result = html.xpath('//li[@class="item-0"]')

print(result)

得到的结果;

image.png

我们可以看到有两个结果,但是对不对,我们不知道,所以我们需要下面这个功能,文本获取

文本获取

使用XPath的text方法可以获取节点的文本,我们来获取一下上面的文本:

result = html.xpath('//li[@class="item-0"]/text()')

这样我们就调用了这个text()获取文本,但是我们目前只能获得一个/n 一个换行符,为什么呢? 因为仔细观察上面的HTML代码,我们发现我们想要的东西,在,<a>标签下,所以我们还需要修改一下代码:

result = html.xpath('//li[@class="item-0"]/a/text()')

result = html.xpath('//li[@class="item-0"]//text()') 这也能获得上面的结果,会多一个换行符,所以需要全部文本的话,还是使用// 这种方式,需要整洁的指定好子节点.

属性获取

那么我们要是想获取节点的属性该怎么办呢:

result = html.xpath('//li/@class')

刚刚说过了,属性就用@来表示,很好理解,我们的返回值是一个列表

明天上班了,早点睡吧还是.