python xpath解析html

什么是 XML
1、XML 指可扩展标记语言(EXtensible Markup Language)。
2、XML 是一种标记语言,很类似 HTML 。
3、XML 的设计宗旨是传输数据,而非显示数据 。
4、XML 的标签需要我们自行定义。
5、XML 被设计为具有自我描述性。
6、XML 是 W3C 的推荐标准 。

XML 和 HTML 的区别
在这里插入图片描述

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 = '''
	 <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>  
'''

# 利用 etree.HTML,将字符串解析为 HTML 文档 
html = etree.HTML(text)  

# 按字符串序列化 HTML 文档 
result = etree.tostring(html).decode() 
print(result) 

lxml 可以自动修正html代码,例子里不仅补全了 li 标签,还添加了 bodyhtml 标签。

html文件解析

hello.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>  

from lxml import etree 


# 读取外部文件 hello.html 
html = etree.parse('./hello.html') 

result = etree.tostring(html, pretty_print=True).decode() 
print(result) 



XPath 实例测试

1、获取所有的<li>标签

from lxml import etree 

html = etree.parse('hello.html') 

# 显示 etree.parse() 返回类型 
print(type(html)) 

result = html.xpath('//li') 

 # 打印<li>标签的元素集合 
print(result) 
print(len(result)) 
print(type(result)) 
print(type(result[0])) 



2、 获取<li> 标签的所有 class属性

from lxml import etree 


html = etree.parse('hello.html') 
result = html.xpath('//li/@class') 
print(result) 

3、获取<li>标签下 hreflink1.html<a> 标签 。

from lxml import etree 


html = etree.parse('hello.html') 
result = html.xpath('//li/a[@href="link1.html"]') 
print(result) 


4、 获取<li> 标签下的所有 <span> 标签

from lxml import etree 


html = etree.parse('hello.html') 
# 注意这么写是不对的
# 因为 / 是用来获取子元素的,而 <span> 并不是 <li> 的子元素,所以,要用双斜杠 ,子孙
# result = html.xpath('//li/span') 

result = html.xpath('//li//span') 
print(result) 


5、获取 <li> 标签下的<a>标签里的所有 class

from lxml import etree 

html = etree.parse('hello.html') 
result = html.xpath('//li/a//@class') 
print(result) 


6、获取最后一个 <li><a>href

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) 


猜你喜欢

转载自blog.csdn.net/MZP_man/article/details/100799136