XPATH

  • html解析方法有哪些
  • 本文重点介绍etree.xpath
  • etree.xpath 使用
  • 练习题
  • xpath 语法
  • xpath与正则表达式
  • 推荐链接学习


html解析方法有哪些

etree.xpath 非常简明了的路径选择表达式
BeautifulSouppyquery pandas 常用于解析表格,网络url本地文件html皆可

本文重点介绍etree.xpath

XPath,全称XML Path Language,即XML路径语言,可以在XML,HTML文档中查找信息的语言,XPath的选择功能十分强大,提供了非常简明了的路径选择表达式。

xpath解析原理:
1.实现标签的定位:实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中。
2.调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获


etree.xpath 使用

  1. 模块导入
    安装第三方库 pip install lxml 导入模块 from lxml import etree
  2. 载入本地html文件或者字符串
    本地文件加载 etree.parse(file_url) 网络资源加载 etree.HTML(html_text)#html_text互联网中响应的数据
  1. 载入本地html文件,并完整打印
from lxml import  etree
html = etree.parse('regression.html',etree.HTMLParser())
result = etree.tostring(html)
print(result.decode("utf-8"))
  1. 载入字符串
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'))
  1. 载入本地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语法 正则表达式

  1. 解析网络资源参照下面链接
  1. 按照各种规则来提取第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 , 或者是正则表达式写的不对