网页数据的解析提取

XPath的使用

  全称是XML Path Language。最初用来搜寻XML文档,但也适用于HTML文档的搜索。所以在做爬虫时,完全可以使用XPath来实现相应信息抽取。

XPath概览

  XPath提供了非常简洁的路径选择表达式。还有内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等。

XPath常用规则

表达式 描述
nodename 选取此节点的所有节点
/ 从当前节点选取直接子节点
// 从当前节点选取子孙节点
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

例://title[@lang='eng'] 代表选择所有名称为title,同时属性lang的值为eng的节点。
后面根据lxml库,利用XPath对HTML进行解析。

安装lxml

可以使用pip3 来安装:
pip3 install lxml

实例引入

感受XPath对网页进行解析过程
相关代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from lxml import etree
text = '''
<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">four item</a></li>
<li class=""item-0><a href="link4.html">five item</a></li>
</ul>
</div>
'''
html = etree.HTML(text)
result = etree.tostring(html)
print(result.decode('utf-8'))

>>>
<html><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">four item</a></li>
<li class="" item-0=""><a href="link4.html">five item</a></li>
</ul>
</div>
</body></html>

先导入lxml库的etree模块,然后声明HTML文本,用HTML类进行初始化,构造一个XPath解析对象。etree模块可以自动修正HTML文本。

也可以直接读取文本文件进行解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from lxml import etree

html = etree.parse('./test.html',etree.HTMLParser())
print(etree.tostring(html).decode('utf-8'))

>>>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><div>&#13;
<ul>&#13;
<li class="" item-0=""><a href="link1.html">first item</a></li>&#13;
<li class="" item-1=""><a href="link2.html">second item</a></li>&#13;
<li class="" item-inactive=""><a href="link3.html">third item</a></li>&#13;
<li class="" item-1=""><a href="link4.html">four item</a></li>&#13;
<li class="" item-0=""><a href="link4.html">five item</a>&#13;
</li></ul>&#13;
</div></body></html>