欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

爬虫(六):XPath、lxml模块

程序员文章站 2022-03-07 16:03:13
1. XPath 1.1 什么是XPath XPath(XML Path Language) 是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历。 1.2 XPath开发工具 1.2.1 Chrome插件XPath Helper https://jing ......

1. xpath

1.1 什么是xpath

xpath(xml path language) 是一门在xml和html文档中查找信息的语言,可用来在xml和html文档中对元素和属性进行遍历。

1.2 xpath开发工具

1.2.1 chrome插件xpath helper

1.2.2 firefox插件xpath checker

1.3 xpath语法

这个就要看我写的selenium基础中的文章了。

2. lxml模块

lxml是一个html/xml的解析库,主要功能是如何解析和提取html/xml数据。

lxml和正则是一样,也是用c语言实现的,是一款高性能的python html/xml解析器,可以利用之前学习的xpath语法,来快速定位特定元素以及节点信息。

可通过 pip 安装:

pip install lxml -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

2.1 基本使用

我们可以利用它来解析html 代码,且在解析 html 代码的时候,如果 html 代码不规范,他会自动进行补全。

from lxml.html import etree

htmltext = '''
<div>
    <ul>
        <li class="item-0"><a href="link1.html">first item</a></li> 
        <li class="item-1"><a href="link2.html">second item</a></li>
        <li class="item-inactive"><a href="link3.html">third item</a></li> 
        <li class="item-1"><a href="link4.html">fourth item</a></li>
        <li class="item-0"><a href="link5.html">fifth item</a></li> 
    </ul>
</div>
'''

# 利用 etree.html,将字符串解析为 html 文档
html = etree.html(htmltext)

# 按字符串序列化 html 文档
result = etree.tostring(html, encoding='utf-8', pretty_print=true).decode('utf-8')

print(result)

2.2 在文件中读取html代码

除了直接使用字符串进行解析,lxml 还支持从文件中读取内容。

html代码:

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="utf-8">
    <title></title>

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

然后利用etree.parse()方法来读取文件。

from lxml.html import etree

html = etree.parse('./hello.html')
result = etree.tostring(html, encoding='utf-8', pretty_print=true).decode('utf-8')
print(result)

结果:

爬虫(六):XPath、lxml模块

 

我们看到居然报错了,为什么呢? 

之所以使用etree.parse()方法解析 html 内容时,会报lxml.etree.xmlsyntaxerror的错,是因为etree.parse()默认使用的是xml的解析器,所以当html内容不规范,比如出现某个标签缺少闭合标签时,就会报这个错误。这时,可使用etree.htmlparser()创建一个html的解析器,然后作为etree.parse()方法的参数即可。

from lxml.html import etree

htmlparser = etree.htmlparser(encoding='utf-8')
html = etree.parse('./hello.html', parser=htmlparser)
result = etree.tostring(html, encoding='utf-8', pretty_print=true).decode('utf-8')
print(result)

2.3 在lxml中使用xpath语法

使用xpath语法,应该使用element.xpath语法,来执行xpath的选择。

xpath函数返回的永远是一个列表。

我们先来匹配下li标签和a标签

from lxml.html import etree

htmlparser = etree.htmlparser(encoding='utf-8')
html = etree.parse('./hello.html', parser=htmlparser)

lis = html.xpath('//li')
for li in lis:
    print(etree.tostring(li, encoding='utf-8', pretty_print=true).decode('utf-8'), end='')

alist = html.xpath('//a/@href')
for a in alist:
    print(a)

爬虫(六):XPath、lxml模块

 

获得li标签下a标签的href属性和内容:

from lxml.html import etree

htmlparser = etree.htmlparser(encoding='utf-8')
html = etree.parse('./hello.html', parser=htmlparser)

lis = html.xpath('//li')
for li in lis:
    # . 号表示在当前的 li 元素下去匹配
    href = li.xpath('.//a/@href')[0]   #获取 a 标签的 href 属性
    txt = li.xpath('.//a/text()')[0]   #获取 a 标签的文本
    print(href, txt)

爬虫(六):XPath、lxml模块