python解析库之 XPath

摘要:
1.XPath(XMLPathLanguage)XML路径语言2。XPath通用规则:nodename选择此节点的所有子节点/从当前节点选择直接子节点//从当前节点中选择子节点。选择当前节点选择当前节点的父节点@选择属性3。实例1来自lxmlimportetree23text=''456˂ahref=“http

1. XPath (XML Path Language) XML路径语言

2. XPath 常用规则:

  nodename    选取此节点的所有子节点

  /                    从当前结点选取直接子节点

  //                   从当前结点选取子孙节点

  .                    选取当前结点

  ..                   选取当前结点的父节点

  @                 选取属性

3. 实例

 1 from lxml import etree
 2 
 3 text = '''
 4 <div>
 5     <ul>
 6         <li class="item-0"><a href="http://t.zoukankan.com/link1.html">first item</a></li>
 7         <li class="item-1"><a href="http://t.zoukankan.com/link2.html">second item</a></li>
 8         <li class="item-inactive"><a href="http://t.zoukankan.com/link3.html">third item</a></li>
 9         <li class="item-1"><a href="http://t.zoukankan.com/link4.html">fourth item</a></li>
10         <li class="item-0"><a href="http://t.zoukankan.com/link5.html">fifth item</a>
11     </ul>
12 </div>
13 '''
14 html = etree.HTML(text) # 初始化,构造XPath对象
15 # 自动修正html代码,最后一个<li>没有闭合,tostring()方法补全html代码,返回结果是bytes类型
16 result = etree.tostring(html)
17 print(result.decode('utf-8'))

也可以读取文件来进行解析

1 from lxml import etree
2 
3 html = etree.parse(r'C:UsersAdministratorDesktop	est.txt', etree.HTMLParser())
4 result = etree.tostring(html) 
5 print(result.decode('utf-8'))

4. 使用//开头的XPath规则来选取符合要求的节点

from lxml import etree

text = '''
<div>
    <ul>
        <li class="item-0"><a href="http://t.zoukankan.com/link1.html">first item</a></li>
        <li class="item-1"><a href="http://t.zoukankan.com/link2.html">second item</a></li>
        <li class="item-inactive"><a href="http://t.zoukankan.com/link3.html">爱我中华</a></li>
        <li class="item-1"><a href="http://t.zoukankan.com/link4.html">fourth item</a></li>
        <li class="item-0"><a href="http://t.zoukankan.com/link5.html">fifth item</a>
    </ul>
</div>
'''
'''匹配节点'''
html = etree.HTML(text)
result1 = html.xpath('//*')  # 使用*匹配所有节点
print(result1)
result2 = html.xpath('//li') # 获取所有的li节点
print(result2)
print(result2[0])
result3 = html.xpath('//li/a')  # 获取所有li节点的直接a子节点
print(result3)

# 首先选中href属性为link3.html的a节点,然后再获取其父亲节点,在获取其class属性的值
# result4 为['item-inactive'],这是个只有一个元素的列表
result4 = html.xpath('//a[@href="http://t.zoukankan.com/link3.html"]/../@class')
print(result4[0])
# 同时, 也可以通过parent::来获取父亲节点 如:
result5 = html.xpath('//a[@href="http://t.zoukankan.com/link3.html"]/parent::*/@class')

'''属性匹配  (选取节点时,可以用@符号进行属性过滤)'''
# 匹配属性class="item-inactive"的li节点
result6 = html.xpath('//li[@class="item-inactive"]')
print(result6)

'''文本获取 (使用XPath中的text()方法获取节点中的文本)'''
result7 = html.xpath('//li[@class="item-inactive"]/a[@href="http://t.zoukankan.com/link3.html"]/text()')
print(result7) #  打印出 ['爱我中华'] 列表

'''属性获取 使用@来获取属性'''
# 匹配属性href="http://t.zoukankan.com/link3.html"的a节点的父亲节点的class属性
result8 = html.xpath('//a[@href="http://t.zoukankan.com/link3.html"]/../@class')
print(result8) # 打印['item-inactive']

'''属性多值匹配'''
html_test = '''<li class="li item-inactive"><a href="http://t.zoukankan.com/link3.html">爱我中华</a></li>'''
# 这里li标签class属性有两个值, 如果按照上边的属性匹配 是匹配不到的,就要用到contains()函数
html_test = etree.HTML(html_test)
# 通过contains方法,第一个参数穿属性名,第二个传属性值中的任意一个,都可以匹配到
result9 = html_test.xpath('//li[contains(@class, "li")]/a/text()')
print(result9)

'''多属性匹配 (根据多个属性来确定一个节点)'''
html_test2 = '''<li   name="item"><a href="http://t.zoukankan.com/link3.html">Hello World</a></li>'''
# 这里li标签class属性有两个值, 如果按照上边的属性匹配 是匹配不到的,就要用到contains()函数
html_test = etree.HTML(html_test2)
# 通过contains方法,第一个参数穿属性名,第二个传属性值中的任意一个,都可以匹配到
result10 = html_test.xpath('//li[contains(@class, li) and @name="item"]/a[@href="http://t.zoukankan.com/link3.html"]/text()')
print(result10) # 打印['Hello World']

5. XPath 运算符

python解析库之 XPath第1张

5. 按序选择 (同时匹配了多个节点时但又只想要其中一个节点时)

from lxml import etree

text = '''
<div>
    <ul>
        <li class="item-0"><a href="http://t.zoukankan.com/link1.html">first item</a></li>
        <li class="item-1"><a href="http://t.zoukankan.com/link2.html">second item</a></li>
        <li class="item-inactive"><a href="http://t.zoukankan.com/link3.html">爱我中华</a></li>
        <li class="item-1"><a href="http://t.zoukankan.com/link4.html">fourth item</a></li>
        <li class="item-0"><a href="http://t.zoukankan.com/link5.html">fifth item</a>
    </ul>
</div>
'''
'''匹配节点后按序选择'''
html = etree.HTML(text)
result1 = html.xpath('//li[1]/a/text()')  # 选取匹配到的li节点的第一个
print(result1)
result2 = html.xpath('//li[last()]/a/text()')  # 选取匹配到的li节点的最后一个
print(result2)
result3 = html.xpath('//li[position()<3]/a/text()')  # 选取匹配到的所有li节点中位置小于3,也就时第1,2个
print(result3)
result4 = html.xpath('//li[last()-2]/a/text()')  # 选取匹配到的li节点的倒数第三个
print(result4)

'''节点轴选择'''
html = etree.HTML(text)
result5 = html.xpath('//li[1]/ancestor::*')  # 选取匹配到的li节点的第一个的所有祖先节点
print(result5)
result6 = html.xpath('//li[1]/attribute::*')  # 选取匹配到的li节点的所有属性值
print(result6)
result7 = html.xpath('//li[1]/child::a')  # 选取匹配到的li节点的所有子节点
print(result7)
result8 = html.xpath('//li[1]/descendant::a')  # 选取匹配到的li节点的所有子孙节点
print(result8)
result9 = html.xpath('//li[1]/following::*')  # 选取获取到的当前结点后的所有节点
print(result9)
result10 = html.xpath('//li[1]/following-sibling::*')  # 选取获取到的当前结点之后的所有同级节点
print(result10)

免责声明:文章转载自《python解析库之 XPath》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇phpexcel简单用法Hikaricp源码解读(2)——配置介绍及对应源码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

移动端自动化==&amp;gt;Appium定位方式总结

1、ID Android Android的resource-id对应ID定位方式,可以通过index来获取需要的元素(从0开始查找dom树中的同名resource-id属性)。使用appium-desktop来获取元素时,id和resource-id是相同的,如果只有resource-id,可能存在重复现象,如果提示有id的定位方式,则可以只接获取,代表唯...

Web自动化学习(4)

1、Selenium中有哪些不同类型的定位器? 定位器可以看作一个地址,用于在网页中唯一标识一个页面元素,为了准确地识别Web元素 Selenium中有8种不同的定位方式:ID;ClassName;Name;TagName;LinkText;PartialLinkText;Xpath;CSS Selector。 2、什么是XPath? 元素定位方式的一种...

Scrapy 框架 入门教程

Scrapy入门教程 在本篇教程中,我已经安装好Scrapy 本篇教程中将带您完成下列任务: 创建一个Scrapy项目 定义提取的Item 编写爬取网站的 spider 并提取 Item 编写 Item Pipeline 来存储提取到的Item(即数据) 创建项目 在开始爬取之前,您必须创建一个新的Scrapy项目。 进入您打算存储代码的目录中,运行...

[转]ios几种常用的XML解析器

SAX解析器是在你的代码分析器通知作为遍历XML树,你是通过负责保持跟踪状态和建设的任何对象你可能想游行保持分析器跟踪的数据。 DOM解析器读取整个文件,并建立了一个在内存中的表示,你可以查询不同的元素。 通常情况下,你甚至可以构建XPath查询退出特别件。   1、NSXMLParser是一个SAX解析器SDK中包含的iPhone默认的。 这是写在Obj...

爬虫实战(一) 用Python爬取百度百科

最近博主遇到这样一个需求:当用户输入一个词语时,返回这个词语的解释 我的第一个想法是做一个数据库,把常用的词语和词语的解释放到数据库里面,当用户查询时直接读取数据库结果 但是自己又没有心思做这样一个数据库,于是就想到了百度百科这么一个现成的 “数据库” 下面我们就通过 urllib 和 xpath 来获取百度百科的内容 1、爬取百度百科 百度百科是一个静态...

[爬虫]采用Go语言爬取天猫商品页面

最近工作中有一个需求,需要爬取天猫商品的信息,整个需求的过程如下: 修改后端广告交易平台的代码,从阿里上传的素材中解析url,该url格式如下: https://handycam.alicdn.com/slideshow/26/7ef5aed1e3c39843e8feac816a436ecf.mp4?content=%7B%22items%22%3A%5B...