02 Python网络爬虫Xpath模块

XPath是一种用于在XML文档中定位节点的查询语言,XPath模块则是指用于解析和查询XML文档中XPath表达式的工具或库。

XPath模块通常由编程语言或应用程序提供,例如Java中的XPath API,Python中的lxml库,或者在浏览器中使用JavaScript的XPath实现等。通过使用XPath模块,可以方便地在XML文档中找到所需的数据或节点,使得XML文档的处理更加高效和便捷。

在Python中,我们可以使用许多XPath模块来处理XML文档,例如lxml、xml.etree.ElementTree、xml.dom等。其中,lxml是最常用的XPath模块之一,因为它非常高效且易于使用。

要使用lxml模块,首先需要安装它。可以通过使用pip包管理器来安装它,使用命令

pip install lxml

将会使用到的Book案例代码:




    
        第一本:舌尖上的中国
        美味生活
        李国瑞
        2016
        16.80
    
     
        第二本:大脑中的动物
        海底总动员
        周天昊
        2018
        36.80
    
     
        第三本:web前端一站式开发
        疯狂的web前端
        王科
         王石
         王天一
         王启强
        2022
        76.80
    

     
        第四本:JS教程
        JavaScript基础教程
        李瀚文
        2023
        38.80

    

1.选取节点

'''
01-XPath模块-选取节点
'''
from lxml import etree

# 将book.xml解析成HTML DOM模型
htmlDom = etree.parse("book.xml")

# 
print(htmlDom)

# 1.获取所有的book节点
 result = htmlDom.xpath("book")
# [,
# ,
# ,
# ]
 print("1.所有的book节点:",result)

# 循环遍历每个节点对象
 for element in result:
     # 1.1 遍历节点的标签名称
     print("1.1 标签名称:",element.tag)
     # 1.2 遍历子节点的文本
     print("1.2 标签文本:",element.text)
     # 1.3 遍历子节点的属性
     print("1.3 标签属性:",element.attrib)

'''2.从根节点开始'''
# []
result = htmlDom.xpath("/bookstore")
print("2.从根节点开始:",result)

'''3.获取所有book的节点 //book'''
result = htmlDom.xpath("//book")
print("3.获取所有book的节点:",result)

'''4.获取bookstore中所有book子节点 /bookstore/book'''
result = htmlDom.xpath("/bookstore/book")
print("4.获取bookstore中的book子节点:",result)

'''5.获取所有的属性 //@'''
result = htmlDom.xpath("//@category")
print("5.获取节点属性名为category的:",result)

2.谓语

'''
02-XPath模块-谓语
'''
from lxml import etree

# 转换
htmlDom = etree.parse("book.xml")

# 1.获取bookstore子元素的 第一个元素
result = htmlDom.xpath("/bookstore/book[1]")
print("1.获取bookstore子元素的第一个元素:",result[0].text)

# 2.获取bookstore子元素的最后一个元素
result = htmlDom.xpath("/bookstore/book[last()]")
print("2.获取bookstore子元素的最后一个元素:",result[0].text)

# 3.获取bookstore子元素的倒数第二个元素
result = htmlDom.xpath("/bookstore/book[last()-1]")
print("3.获取bookstore子元素的倒数第二个元素:",result[0].text)

# 4.获取bookstore子元素的前两个元素
result = htmlDom.xpath('/bookstore/book[position()<3]')
print("4.获取bookstore子元素的前两个元素:",result)

# 5.获取属性名为lang的title元素
result = htmlDom.xpath("//title[@lang]")
print("5.获取属性名为lang的title元素:",result)

# 6.获取属性名为lang的title元素且值为en
result = htmlDom.xpath("//title[@lang='en']")
print("6.获取属性名为lang且值为en的title元素:",result)

# 7.获取bookstore中所有的book元素且price大于35.00
result = htmlDom.xpath("/bookstore/book[price>35.00]")
print("7.获取bookstore中所有的book元素且price大于35.00:",result)

# 8.获取bookstore中所有book元素且price大于35.00的title元素
result = htmlDom.xpath("/bookstore/book[price>35.00]/title")
print("8.获取bookstore中所有book元素且price大于35.00的title元素:",result)


3. 选取未知节点

'''
03-XPath模块-选取未知节点
'''
from lxml import etree

htmlDom = etree.parse("book.xml")

# 1.选取bookstore元素的所有子元素
result = htmlDom.xpath("/bookstore/*")
print("1.选取bookstore元素的所有子元素:",result)

# 2.选取文档中的所有元素
result = htmlDom.xpath("//*")
print("2.选取文档中的所有元素:",result)

# 3.选取所有带有属性title的元素
result = htmlDom.xpath("//title[@*]")
print("3.选取文档中的所有title元素且带有属性的元素:",result)
print(result[0].text)
print(result[1].text)
print(result[2].text)
print(result[3].text)

4. 选取若干路径

'''
04-XPath模块-选取若干路径
'''
from lxml import etree

# 转换
htmlDom = etree.parse("book.xml")

# 1.选取book元素的所有title和price元素
result = htmlDom.xpath("//book/title|//book/price")
print("1.选取book元素的所有title和price元素:",result)

# 2.选取文档中所有title和price元素
result = htmlDom.xpath("//title|//price")
print("2.选取文档中所有title和price元素",result)

# 3.选取属于bookstore元素book元素的所有title元素以及文档中的所有price
result = htmlDom.xpath("/bookstore/book/title | //price")
print("3.选取属于bookstore元素book元素的所有title元素以及文档中的所有price:",result)

# "//h1|//div[@id='htmlContent']"
# result[0]  result[1]

5. 使用XPath定位Html简单实例

已知Html实例如下:

使用XPath语法进行定位:

'''
XPath模块-实例测试
'''
from lxml import etree

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

# 1.获取所有的li标签
result = html.xpath("//li")
print("1.获取所有的li标签:",result[0].attrib)

# 2.获取所有的li标签下的class属性
result = html.xpath("//li/@class")
print("2.获取所有的li标签下的class属性:",result)

# 3.获取li标签下href的值为link1.html
result = html.xpath("//li/a[@href='link1.html']")
print("3.获取li标签下href的值为link1.html的元素",result[0].text)

# 4.获取所有的li标签下span标签
result = html.xpath("//li//span")
print("4.获取所有的li标签下span标签:",result)

你可能感兴趣的:(Python爬虫,网络爬虫,python)