什么是 XML
1、XML 指可扩展标记语言(EXtensible Markup Language
)。
2、XML 是一种标记语言,很类似 HTML 。
3、XML 的设计宗旨是传输数据,而非显示数据 。
4、XML 的标签需要我们自行定义。
5、XML 被设计为具有自我描述性。
6、XML 是 W3C
的推荐标准 。
HTML DOM 模型示例
HTML DOM
定义了访问和操作 HTML
文档的标准方法,以树型结构表示HTML
文档。
什么是 xpath
XPath (XML Path Language)
是一门在 XML
文档中查找信息的语言,可用来在 XML
文档中对元素和属性进行遍历。
选取节点
XPath
使用路径表达式来选取 XML
文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。
下面列出了最常用的路径表达式:
一些路径表达式以及表达式的结果:
谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定的值的节点,被嵌在方括号中。
在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
选取未知节点
XPath
通配符可用来选取未知的 XML
元素。
在下面的表格中列出了一些路径表达式,以及这些表达式的结果:
选取若干路径
通过在路径表达式中使用“|”运算符,可以选取若干个路径。
XPath 的运算符
下面列出了可用在 XPath
表达式中的运算符:
XPath 开发工具
1、开源的XPath
表达式编辑工具:XMLQuire
(XML
格式文件可用) 。
2、Chrome
插件 XPath Helper
3、Firefox
插件 XPath Checker
XPath Helper
安装
1、无法访问谷歌商店时,安装谷歌访问助手安装
https://blog.csdn.net/kwoky/article/details/74529139
2、到谷歌商店安装 xpath
https://blog.csdn.net/kwoky/article/details/80677117
lxml 库
lxml
是 一个HTML/XML
的解析器,主要的功能是如何解析和提取 HTML/XML
数据。 lxml
和正则一样,也是用 C
实现的,是一款高性能的 Python HTML/XML
解析器,可以利用XPath
语法,来快速的定位特定元素以及节点信息。
官方文档: https://lxml.de/index.html
安装
pip install lxml
解析 HTML 代码
# 使用 lxml 的 etree 库
from lxml import etree
text = '''
- first item
- second item
- third item
- fourth item
- fifth item # 注意,此 处缺少一个
闭合标签
'''
# 利用 etree.HTML,将字符串解析为 HTML 文档
html = etree.HTML(text)
# 按字符串序列化 HTML 文档
result = etree.tostring(html).decode()
print(result)
lxml
可以自动修正html
代码,例子里不仅补全了 li
标签,还添加了 body
,html
标签。
html文件解析
hello.html 文件:
- first item
- second item
- third item
- fourth item
- fifth item # 注意,此 处缺少一个
闭合标签
from lxml import etree
# 读取外部文件 hello.html
html = etree.parse('./hello.html')
result = etree.tostring(html, pretty_print=True).decode()
print(result)
XPath 实例测试
1、获取所有的标签
from lxml import etree
html = etree.parse('hello.html')
# 显示 etree.parse() 返回类型
print(type(html))
result = html.xpath('//li')
# 打印标签的元素集合
print(result)
print(len(result))
print(type(result))
print(type(result[0]))
2、 获取 标签的所有
class
属性
from lxml import etree
html = etree.parse('hello.html')
result = html.xpath('//li/@class')
print(result)
3、获取标签下
href
为 link1.html
的 标签 。
from lxml import etree
html = etree.parse('hello.html')
result = html.xpath('//li/a[@href="link1.html"]')
print(result)
4、 获取 标签下的所有
标签
from lxml import etree
html = etree.parse('hello.html')
# 注意这么写是不对的
# 因为 / 是用来获取子元素的,而 并不是 的子元素,所以,要用双斜杠 ,子孙
# result = html.xpath('//li/span')
result = html.xpath('//li//span')
print(result)
from lxml import etree
html = etree.parse('hello.html')
result = html.xpath('//li/a//@class')
print(result)
from lxml import etree
html = etree.parse('hello.html')
# 谓语 [last()] 可以找到最后一个元素
result = html.xpath('//li[last()]/a/@href')
print(result)
7、获取倒数第二个元素的内容
from lxml import etree
html = etree.parse('hello.html')
result = html.xpath('//li[last()-1]/a')
# text 方法可以获取元素内容
print(result[0].text)
8、获取 class
值为 bold
的标签名 。
from lxml import etree
html = etree.parse('hello.html')
result = html.xpath('//*[@class="bold"]')
# tag 方法可以获取标签名
print(result[0].tag)