python xpath解析html

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

XML 和 HTML 的区别
python xpath解析html_第1张图片

HTML DOM 模型示例

HTML DOM 定义了访问和操作 HTML 文档的标准方法,以树型结构表示HTML 文档。

python xpath解析html_第2张图片

什么是 xpath

XPath (XML Path Language) 是一门在 XML 文档中查找信息的语言,可用来在 XML 文档中对元素和属性进行遍历。

选取节点
XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。

下面列出了最常用的路径表达式:
python xpath解析html_第3张图片
一些路径表达式以及表达式的结果:
python xpath解析html_第4张图片

谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定的值的节点,被嵌在方括号中。

在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
python xpath解析html_第5张图片

选取未知节点

XPath 通配符可用来选取未知的 XML 元素。
python xpath解析html_第6张图片
在下面的表格中列出了一些路径表达式,以及这些表达式的结果:
python xpath解析html_第7张图片

选取若干路径
通过在路径表达式中使用“|”运算符,可以选取若干个路径。
python xpath解析html_第8张图片
XPath 的运算符
下面列出了可用在 XPath 表达式中的运算符:
python xpath解析html_第9张图片

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 = '''
	 
''' # 利用 etree.HTML,将字符串解析为 HTML 文档 html = etree.HTML(text) # 按字符串序列化 HTML 文档 result = etree.tostring(html).decode() print(result)

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

html文件解析

hello.html 文件:
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、获取

  • 标签下 hreflink1.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)
  • 5、获取

  • 标签下的标签里的所有 class

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

    6、获取最后一个

  • 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) 
    
    
    
  • 你可能感兴趣的:(python,爬虫,Python,小技巧)