lxml 和 XPah (爬虫)
XPath 的基本语法规则
XPath 语法规则 | 描述 |
---|---|
nodename | 选取此节点的作用子节点 |
/ | 从当前节点选取直接子节点 |
// | 从当前节点选取子孙节点 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
注意:
-
通过X Path定位节点返回的是节点集合,即使只有一个节点,返回的也是一个节点集合。
-
使用XPath分析的HTML文档并不一定是标准的,可以没有像 <html>、<head>、<body> 这些节点。任何一段符合HTML语法标准的代码都可以使用XPah进行定位。
获取内容
- 通过getroot方法获得根节点
- 通过get方法获得节点属性值,
- 通过text方法属性获取节点内容,通过索引的方式引用子节点。
如有一个下面的HTML
html = '''
<div>
<ul>
<li class="item1"><a href ="http:1">1</a><p>11</p></li>
<li class="item2"><a href ="http:2">2</a></li>
<li class="item3"><a href ="http:3">3</a></li>
</ul>
</div>
集合的概念
下面代码:
from lxml import etree
# 分析HTML代码
tree = etree.HTML(html)
# 使用 xpath 定位
aTags = tree.xpath("//li")
print(aTags[0][0].text) # 对应<a>
print(aTags[0][1].text) # 对应<p>
print(aTags[1][0].text)
# 输出
1
11
2
.分析
//
:由上面的语法规则,这个当前节点指的是html这个整体,即文档节点。所以这样可以的到<div>、<ul>、<li>
在内的节点li
:是语法规则第一条,就是选取所有节点名为li
- 之后返回是一个集合,因为在该案列中有三个,所以可以想象成是一个二维集合。其中在
li
中的每一个标签一同构成了一个二维数组
属性匹配与获取
比较常用的匹配就是根据属性值来选取节点。引用属性值需要在属性名前面加@,如@class表示class属性。
XPath 的过滤条件需要放到一对中括号([…])中,如'//a[@class="item1"]'
表示过滤所以class属性值为item1的<a>
节点。如果不放在括号里,如‘//a/@href'
表示获取<a>
节点的href属性值。
如上面的例子我们要获取第二个li 可以这样写:
aTags = tree.xpath("//li[@class='item2']")
按序选择节点
在很多时候,在选中某些节点时,按一些属性进行匹配,可能同时有多个节点满足条件,而只想得到其中的一个或几个节点。
这时就要使用索引的方式获取特定的节点。在X Path中使用索引的方式与 Python 中引用列表中元素的方式类似,都是在中括号中使用索引,
如上面的例子我们要获取第二个li 也可以这样写:
aTags = tree.xpath("//li[2]")
注意:在这里下标是从1开始的。