python 爬虫常用模块lxml使用

  1. lxml库的安装

    1
    pip install lxml
  2. xpath常用规则说明

表达式 规则描述
nodename 选取此节点打所以子节点,xpath(‘body’)
/ 从当前节点选取直接子节点
// 从当前节点选取子孙节点
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性
* 通配符,选取所有元素节点与元素名
@* 选取所有属性
[@attrib] 选取具有给定属性的所有元素
@attrib=’’value’ 选取给定属性具有给定值得所有元素
text() 选取文本,/text()选取标签中直系的文本内容,//text()选取标签中所有文本内容

查找某个特定的节点或者包含某个特定值的节点,用“[]”括起来。

实例

表达式 规则描述
/div/p[n] 选取div子元素的第n个p元素
/div/p[last()] 选取div子元素的最后一个p元素
/div/p[last()-1] 选取div子元素的倒数第二个p元素
/div/p[book<n] 选取div子元素的前n-1个book元素
//div/[@id] 选取所有拥有名称为id属性的div节点
//div[@id=’app’ 选取所有div节点,且拥有id属性的值为app的属性
  1. 举例
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
from lxml import etree,html

ret = """
<div>
<ul>
<li class="item-0"><a href="link1.html">第一个</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-0"><a href="link5.html">a属性</a>
</ul>
</div>

"""


ret1 = requests.get("http://www.linke.fun")
#从文本获取解析对象,有两种方式etree.HTML()和html.fromstring()方法,对比两种方式,etree解析功能更多,html专解析html
html = etree.HTML(ret)
html1 = html.fromstring(ret1.content)

# 读取html文件进行解析
html2=etree.parse('test.html',etree.HTMLParser())

#获取所有节点
## 获取所有节点,//表示获取所有子孙节点,*表示所有
print(html.xpath('//*'))

#获取子节点
## 获取div下的ul子节点
print(html.xpath('//div/ul'))

#获取父节点
## 获取ul节点的父节点,使用.. 或者parent::*
print(html.xpath('//ul/..'))
print(html.xpath('//ul/parent::*'))

#按属性匹配节点
## 一个属性里只有单个属性值获取,通过属性匹配过滤查找节点,形式为[@key=value]
print(html.xpath('//ul[@id="002"]/*')) #选取id=002的ul节点

## 一个属性里有多个属性值时使用contains获取,对比获取class="aaa item-0"和class="aaa"区别
print(html.xpath('//li[@class="aaa"]/a')) #只能匹配class="aaa"
print(html.xpath('//li[contains(@class,"aaa")]/a')) # 可以匹配class="aaa"和class="aaa item-0"

## 多属性匹配,可以使用and运算符连接,查找"<li class="aaa" name="item"><a href="link1.html">第一个</a></li>"
print(html.xpath('//li[@class="aaa" and @name="item"]/a'))

#获取属性
print(html.xpath('//li[@class="aaa"]/a/@href)')) #获取a节点打href值

#获取文本
print(html.xpath('//li[@class="aaa"]/a/text()')) #获取a节点打文本内容

#顺序选择
print(html.xpath('//li[contains(@class,"aaa")]/a/text()')) #获取所有li节点下a节点的内容
print(html.xpath('//li[1][contains(@class,"aaa")]/a/text()')) #获取第一个
print(html.xpath('//li[last()][contains(@class,"aaa")]/a/text()')) #获取最后一个
print(html.xpath('//li[position()>2 and position()<4][contains(@class,"aaa")]/a/text()')) #获取第三个
print(html.xpath('//li[last()-2][contains(@class,"aaa")]/a/text()' #获取倒数第三个

## 节点轴选择
print(html.xpath('//ul/ancestor::*')) # 获取ul节点的所有祖先节点
print(html.xpath('//ul/ancestor::div')) # 获取ul节点的所有祖先div节点
print(html.xpath('//li/attribute::class')) # 获取ul节点的所有属性值
print(html.xpath('//ul/child::li')) # 获取ul节点的所有直接li子节点
print(html.xpath('//ul/descendant::a')) # 获取ul节点的所有子孙节点的a节点
print(html.xpath('//ul[@id=001]/following::*')) # 获取当前子节点之后的所有节点,第一个ul节点之后是第二个ul节点,输出为第二个ul节点和它的所有子孙节点
print(html.xpath('//ul/following-sibling::*')) # 获取当前节点打所有同级节点