XPath是一门在 XML 文档中查找信息的语言. XPath可用来在 XML 文档中对元素和属性进行遍历. 而我们熟知的HTML恰巧属于XML的一个子集. 所以完全可以用xpath去查找html中的内容.
首先, 先了解几个概念.

> <book>
>     <id>1</id>
>     <name>野花遍地香</name>
>     <price>1.23</price>
>     <author>
>         <nick>周大强</nick>
>         <nick>周芷若</nick>
>     </author>
> </book>

在上述html中,

  1. book, id, name, price…都被称为节点.
  2. Id, name, price, author被称为book的子节点
  3. book被称为id, name, price, author的父节点
  4. id, name, price,author被称为同胞节点

OK~ 有了这些基础知识后, 我们就可以开始了解xpath的基本语法了
在python中想要使用xpath, 需要安装lxml模块.

pip install lxml

用法:

  1. 将要解析的html内容构造出etree对象.
  2. 使用etree对象的xpath()方法配合xpath表达式来完成对数据的提取
> from lxml import etree
> 
> html = """
> book/*/nick
> <book>
>     <id>1</id>
>     <name>野花遍地香</name>
>     <price>1.23</price>
>     <nick>臭豆腐</nick>
>     <author>
>         <nick id="10086">周大强</nick>
>         <nick id="10010">周芷若</nick>
>         <nick class="joy">周杰伦</nick>
>         <nick class="jolin">蔡依林</nick>
>         <div>
>             <nick>惹了</nick>
>         </div>
>     </author>
> 
>     <partner>
>         <nick id="ppc">胖胖陈</nick>
>         <nick id="ppbc">胖胖不陈</nick>
>     </partner>
> </book>
> """
> 
> et = etree.XML(html)
>  根据节点进行搜索
>  result = et.xpath("/book")
>  result = et.xpath("/book/id")  # /在开头表示文档最开始, /在中间表示儿子
>  result = et.xpath("/book//nick")  # //表示后代
> result = et.xpath("/book/*/nick")  # *表示通配符
> 
> print(result)

xpath如何提取属性信息. 我们上一段真实的HTML来给各位讲解一下

准备HTML:

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8" />
     <title>Title</title>
 </head>
 <body>
     <ul>
         <li><a href="http://www.baidu.com">百度</a></li>
         <li><a href="http://www.google.com">谷歌</a></li>
         <li><a href="http://www.sogou.com">搜狗</a></li>
     </ul>
     <ol>
         <li><a href="feiji">飞机</a></li>
         <li><a href="dapao">大炮</a></li>
         <li><a href="huoche">火车</a></li>
     </ol>
     <div class="job">李嘉诚</div>
     <div class="common">胡辣汤</div>
 </body>
 </html>

xpath解析

from lxml import etree

f = open(“1.html”, mode=“r”, encoding=‘utf-8’)
tree = etree.HTML(f.read())
result = tree.xpath(“/html/body/ul/li/a/@href”)
print(result)

result = tree.xpath(“/html/body/ul/li”)
for li in result:
print(li.xpath(“./a/@href”)) # 局部解析

result = tree.xpath(“//div[@class=‘job’]/text()”) # [@class=‘xxx’]属性选取 text()获取文本
print(result)

XPath语法:
XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们
在常规的电脑文件系统中看到的表达式非常相似。
image-1670671877946
谓语:
谓语用来查找某个特定的节点或者包含某个指定的值的节点,被嵌在方括号中。
在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:image-1670671936304
通配符:
*表示通配符image-1670671971516
选取多个路径:
通过在路径表达式中使用“|”运算符,可以选取若干个路径。
示例如下:
//bookstore/book | //book/title
选取所有book元素以及book元素下所有的title元素