前篇我们能够知晓xpath的语法规则和python中的lxml库的用法,这一次我们在从lxml库用法中进阶一下。总共六个基本知识用法。
目录
示例文件
首先假设我们有一个简单的HTML文件(这个需要先创建HTML文件,放在你自已需要用到的目录下,确保python的代码能够连接到HTML文件,以免路径出错),代码如下
<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">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>
</ul>
</div>
有的一个假设HTML文件,我们还需要构建一下python中的lxml语法,如下:
from lxml import etree
# 声明 HTML 文本并初始化 XPath 解析对象
html = etree.parse("./text.html", etree.HTMLParser())
# 输出修正后的 HTML 代码并转换成 str 类型
result = etree.tostring(html)
print(result.decode('utf-8'))
代码解释
导入
etree
模块:from lxml import etree
这行代码从
lxml
库中导入了etree
模块,它是用于处理 XML 和 HTML 文档的 API。解析 HTML 文件:
html = etree.parse("./text.html", etree.HTMLParser())
使用
etree.parse()
函数加载并解析一个 HTML 文件。第一个参数是文件路径./text.html
,这表示文件位于当前工作目录下的text.html
。第二个参数etree.HTMLParser()
指定了一个 HTML 解析器,它会在解析过程中自动修复 HTML 中的常见错误,如未闭合的标签等。序列化为字符串:
result = etree.tostring(html)
etree.tostring()
函数将html
解析对象(代表整个 HTML 文档的树结构)转换为一个包含原始 HTML 内容的字节串(bytes)。这一步不直接输出到控制台,因为结果是一个字节串,而不是普通的字符串。解码为 UTF-8 字符串:
print(result.decode('utf-8'))
由于
etree.tostring()
返回的是字节串,而我们通常需要将其作为普通字符串来处理或输出,所以使用decode('utf-8')
方法将字节串解码为 UTF-8 编码的字符串。然后,使用print()
函数将解码后的字符串输出到控制台。这段代码的目的是读取
text.html
文件的内容,并将其作为字符串输出到控制台。这在调试或分析 HTML 文件内容时非常有用。例如,你可能想要查看一个网页的结构,或者在自动化测试中验证页面的 HTML 内容。请注意,这段代码假设
text.html
文件位于当前工作目录中,并且该文件是一个有效的 HTML 文档。如果文件路径或内容有问题,你可能会遇到错误或异常。
输出结果
好了,这样我们就有一个简单的示例,然后根据下面的知识点一一对应
所有节点
一般会用 // 开头的 XPath 规则来选取所有符合要求的节点。
例如*选取所有节点,代码如下
result = html.xpath('//*') # * 选取所有类型的节点
print(result)
完整输出结果
例如选取li节点,代码如下:
result = html.xpath('//li') # 选取li的节点
print(result) # 打印所有
print(result[0]) # 打印第一个
完整输出结果
子节点
通过 / 或 // 即可查找元素的子节点或子孙节点
result = html.xpath('//li/a') # 通过追加 /a 即选择了所有 li 节点的所有直接 a 子节点
print(result)
输出结果
父节点
使用 ..
(这个是有两个小点点)可以选取当前节点的父节点。
result = html.xpath('//a[@href="link4.html"]/../@class')
print(result)
输出结果
属性匹配
使用 @
符号后接属性名可以选取元素的属性。
result = html.xpath('//li[@class="item-0"]')
print(result)
输出结果
代码片段解释
用XPath查询来选择所有class属性为"item-0"的
<li>
元素。
//li[@class="item-0"]
的XPath表达式选择了文档中所有具有class属性为"item-0"的<li>
元素。根据HTML文档内容,会获得一个包含满足条件的
<li>
元素的列表。如果没有符合条件的<li>
元素,则会返回一个空列表。如果HTML文档包含符合条件的
<li>
元素,那么result
将会是一个包含这些元素的列表。
文本获取
使用 text()
可以选取元素的文本内容。
result = html.xpath('//li[@class="item-0"]/a/text()')
print(result)
输出结果
属性获取
节点属性 @符号就可以获取节点内部文本
result = html.xpath('//li/a/@href')
print(result)
输出结果
好了,关于爬虫的理论我们已经知晓并如何使用,当然也可以自行去查网络资源,补充相关爬虫知识点,并用来实战。
爬虫理论再怎么完美,如果不经过实践,理论也会产生错误,只有实践才是检验真理的唯一标准。
好了,后续我会记录一下自已的爬虫心得以及会根据我我所记录的知识用来项目实战。我是好运,想要好运