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

### 使用 `lxml` XPath 进行网页抓取 #### 安装依赖库 为了使用 `lxml` 库,需先安装该库以及可能用到的其他辅助工具。可以通过 pip 来完成安装。 ```bash pip install requests lxml ``` #### 导入必要的模块并发送请求 要实现网页抓取,通常会结合 `requests` 库发起 HTTP 请求获取目标页面的内容,再利用 `lxml` 解析这些内容以便进一步提取所需数据。 ```python import requests from lxml import html ``` #### 获取网页源码并构建树结构 通过向指定 URL 发送 GET 请求获得响应对象后,可以调用 `.content` 属性得到字节形式的 HTML 文档;接着将其传递给 `html.fromstring()` 方法转换成 ElementTree 对象,方便后续应用 XPath 表达式定位节点。 ```python url = 'https://example.com' response = requests.get(url) tree = html.fromstring(response.content) ``` #### 编写 XPath 查询语句执行抓取动作 根据实际需求编写合适的 XPath 路径表达式来选取特定标签下的文本或其他属性值。这里给出几个简单的例子说明如何操作: - 提取出所有的 `<a>` 标签链接地址: ```python links = tree.xpath('//a/@href') print(links) ``` - 查找具有 class 名称为 "title" 的所有 `<div>` 元素内的纯文本内容: ```python titles = tree.xpath('//div[@class="title"]/text()') for title in titles: print(title.strip()) ``` 以上过程展示了基本的工作流程[^1]。值得注意的是,在真实环境中还需要考虑更多因素如异常处理、编码问题等以确保程序稳定运行[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

落春只在无意间

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

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

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

打赏作者

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

抵扣说明:

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

余额充值