XPATH
- html解析方法有哪些
- 本文重点介绍etree.xpath
- etree.xpath 使用
- 练习题
- xpath 语法
- xpath与正则表达式
- 推荐链接学习
html解析方法有哪些
etree.xpath
非常简明了的路径选择表达式BeautifulSoup
pyquery
pandas
常用于解析表格,网络url
和本地文件html
皆可
本文重点介绍etree.xpath
XPath,全称XML Path Language,即XML路径语言,可以在XML,HTML文档中查找信息的语言,XPath的选择功能十分强大,提供了非常简明了的路径选择表达式。
xpath解析原理:
1.实现标签的定位:实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中。
2.调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获
etree.xpath 使用
- 模块导入
安装第三方库pip install lxml
导入模块from lxml import etree
- 载入本地html文件或者字符串
本地文件加载etree.parse(file_url)
网络资源加载etree.HTML(html_text)
#html_text互联网中响应的数据
- 载入本地html文件,并完整打印
from lxml import etree
html = etree.parse('regression.html',etree.HTMLParser())
result = etree.tostring(html)
print(result.decode("utf-8"))
- 载入字符串
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>
'''
# 直接使用初始化已经有的text
html = etree.HTML(text)
result = etree.tostring(html)
print(result.decode('utf-8'))
- 载入本地html文件,并简单筛选(示例)
from lxml import etree
html = etree.parse('regression.html',etree.HTMLParser(encoding='utf-16'))
result01 = html.xpath('//h2[contains(@id,"6.1")]/text()')
print(result01)
可以看出xpath的用法是很简单的,比较核心的问题是学会使用xpath语法
正则表达式
- 解析网络资源参照下面链接
- 按照
各种规则
来提取第2步已经处理好的html
练习题
<p><b>Path: </b>o:\xxx\xxx\xxx\xxx\xxx\abc</p>
<p><b>Path: </b>o:\xxx\xxx\xxx\xxx\xxx\bcd</p>
<p><b>Error: </b>Die Datei o:\xxx\xxx\xxx\xxx\xxx\adb.html</p>
<p><b> Model File: </b>o:\xxx\xxx\xxx\xxx\xxx\.slx</p>
假设我有以下内容,需要提取<p><b>Path: </b>o:\xxx\xxx\xxx\xxx\xxx\abc</p>
这种格式的o:\xxx\xxx\xxx\xxx\xxx\abc
部分,该如何提取?
//p[re:match(text(),"o:")]/text()
匹配的是
<p><b>Path: </b>o:\xxx\xxx\xxx\xxx\xxx\abc</p>
<p><b>Path: </b>o:\xxx\xxx\xxx\xxx\xxx\bcd</p>
<p><b>Error: </b>Die Datei o:\xxx\xxx\xxx\xxx\xxx\adb.html</p>
<p><b> Model File: </b>o:\xxx\xxx\xxx\xxx\xxx\.slx</p>
//p[re:match(text(),"^o:")]/text()
匹配的是
<p><b>Path: </b>o:\xxx\xxx\xxx\xxx\xxx\abc</p>
<p><b>Path: </b>o:\xxx\xxx\xxx\xxx\xxx\bcd</p>
<p><b> Model File: </b>o:\xxx\xxx\xxx\xxx\xxx\.slx</p>
//p/b[re:match(text(),"Path:")]/../text()
匹配的是
<p><b>Path: </b>o:\xxx\xxx\xxx\xxx\xxx\abc</p>
<p><b>Path: </b>o:\xxx\xxx\xxx\xxx\xxx\bcd</p>
综上,xpath语法和正则表达式都是很重要的!
xpath 语法
表达式 | 描述 |
nodename | 选取此节点的所有子节点 |
/ | 表示的是从根节点开始定位。表示的是一个层级。 |
// | 表示的是多个层级。可以表示从任意位置开始定位。 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
* | 通配符,选择所有元素节点与元素名 |
@* | 选取所有属性 |
[@attrib] | 选取具有给定属性的所有元素 |
[@attrib=‘value’] | 选取给定属性具有给定值的所有元素 |
[tag] | 选取所有具有指定元素的直接子节点 |
[tag=‘text’] | 选取所有具有指定元素并且文本内容是text节点 |
格式
获取文本 //标签1[@属性1="属性值1"]/标签2[@属性2="属性值2"]/..../text()
获取属性 //标签1[@属性1="属性值1"]/标签2[@属性2="属性值2"]/..../@属性n
xpath与正则表达式
假设有如下html原文:
<p id = 'postmessage_32199'></p>
<h1 id = 'postmessage_32153'></h1>
xpath规则写法:
//*[starts-with(@id, 'postmessage_')]
//*[contains(@id, 'postmessage_')]
doc.xpath(r'//*[re:match(@id,"postmessage_\d+")]', namespaces={"re": "http://exslt.org/regular-expressions"})
总结用法如下:
ns = {"re": "http://exslt.org/regular-expressions"}
etree.xpath("//*[re:match(@class,'<正则表达式>')]", namespaces=ns)
有很多小伙伴也发现了其他教程,但是试下来可能没什么用,原因可能是namespaces
被写成了namespace
, 或者是正则表达式写的不对