重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章将为大家详细讲解有关Python中XML、HTML和Xpath是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
创新互联公司专注于前锋企业网站建设,响应式网站,电子商务商城网站建设。前锋网站建设公司,为前锋等地区提供建站服务。全流程定制网站制作,专业设计,全程项目跟踪,创新互联公司专业和态度为您提供的服务
当我们处理HTML文档感到十分棘手的时候,我们可以先将HTML文件转换成XML文档,然后用XPath查找HTML节点或元素。
什么是XML
(1)XML 是可扩展标记语言(EXtensible Markup Language)
(2)XML 是一种标记语言,很类似 HTML
(3)XML 的设计宗旨是传输数据,而非显示数据
(4)XML 的标签需要我们自行定义。
(5)XML 被设计为具有自我描述性。
(6)XML 是 W3C 的推荐标准。
XML 和 HTML 的区别
XML文档示例
this is title hello world>
HTML DOM 模型示例
HTML DOM 定义了访问和操作 HTML 文档的标准方法,以树结构方式表达 HTML 文档。
什么是XPath?
XPath (XML Path Language) 是一门在 XML 文档中查找信息的语言,可用来在 XML 文档中对元素和属性进行遍历。
XPath 开发工具
(1)开源的XPath表达式编辑工具:XMLQuire(XML格式文件可用)
(2)Chrome插件 XPath Helper
(3)Firefox插件 XPath Checker
选取节点
XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。
下面列出了最常用的路径表达式:
在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:
谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定的值的节点,被嵌在方括号中。
在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
选取未知节点
XPath 通配符可用来选取未知的 XML 元素。
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
选取若干路径
通过在路径表达式中使用“|”运算符,您可以选取若干个路径。
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
XPath的运算符
下面列出了可用在 XPath 表达式中的运算符:
这些就是XPath的语法内容,在运用到Python抓取时要先转换为xml。
lxml库
lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据。
lxml和正则一样,也是用 C 实现的,是一款高性能的 Python HTML/XML 解析器,我们可以利用之前学习的XPath语法,来快速的定位特定元素以及节点信息。
lxml python 官方文档:http://lxml.de/index.html
需要安装C语言库,可使用 pip 安装:pip install lxml (或通过wheel方式安装)
我们利用它来解析 HTML 代码,简单示例:
from lxml import etree text = '''''' # 利用etree.HTML,将字符串解析为HTML文档 html = etree.HTML(text) # 按字符串序列化HTML文档 # html = etree.tostring(html).decode("utf8") # 不能正常显示中文 html = etree.tostring(html, encoding="utf-8", pretty_print=True, method="html").decode("utf-8") # 可以正常显示中文 print(html)
- first item
- second item
- third item
- fourth item
- fifth item # 注意,此处缺少一个 li 闭合标签
运行结果如下:
- first item
- second item
- third item
- fourth item
- fifth item # 注意,此处缺少一个 li 闭合标签
lxml 可以自动修正 html 代码,例子里不仅补全了 li 标签,还添加了 body,html 标签。
文件读取:
除了直接读取字符串,lxml还支持从文件里读取内容。我们新建一个 index.html 文件:
再利用 etree.parse() 方法来读取文件。
from lxml import etree # 读取外部文件 hello.html html = etree.parse('./index.html', etree.HTMLParser()) # 指定解析器HTMLParser会根据文件修复HTML文件中缺失的如声明信息 html = etree.tostring(html, encoding="utf-8", pretty_print=True, method="html").decode("utf-8") print(html)
运行结果:
接下来我们看一下 XPath 的实力测试。
1. 获取所有的
from lxml import etree html = etree.parse('./index.html', etree.HTMLParser()) print(type(html)) #result = html.xpath('//li') print(result) # [ , , , , ] print(len(result)) # 5 print(type(result)) # print(type(result[0])) #
2. 继续获取
from lxml import etree html = etree.parse('./index.html', etree.HTMLParser()) result = html.xpath('//li/@class') print(result) # ['item-0', 'item-1', 'item-inactive', 'item-1', 'item-0']
3. 继续获取
from lxml import etree html = etree.parse('./index.html', etree.HTMLParser()) result = html.xpath('//li/a[@href="link1.html"]') print(result) # []
4. 获取
from lxml import etree
html = etree.parse('./index.html', etree.HTMLParser())
# result = html.xpath('//li/span')
# 注意这么写是不对的:因为 / 是用来获取子元素的,而 并不是 的子元素,所以,要用双斜杠
result = html.xpath('//li//span')
print(result) # []
5. 获取
from lxml import etree html = etree.parse('./index.html', etree.HTMLParser()) result = html.xpath('//li/a//@class') print(result) # ['bold']
6. 获取最后一个
from lxml import etree html = etree.parse('./index.html', etree.HTMLParser()) result = html.xpath('//li[last()]/a/@href') # 谓语 [last()] 可以找到最后一个元素 print(result) # ['link5.html']
7. 获取倒数第二个元素的内容
from lxml import etree html = etree.parse('./index.html', etree.HTMLParser()) result = html.xpath('//li[last()-1]/a') # text 方法可以获取元素内容 print(result[0].text) # fourth item
8. 获取 class 值为 bold 的标签名
from lxml import etree html = etree.parse('./index.html', etree.HTMLParser()) result = html.xpath('//*[@class="bold"]') # tag方法可以获取标签名 print(result[0].tag) # span
关于Python中XML、HTML和Xpath是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。