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开始的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落春只在无意间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值