1、xpath介绍

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。

在爬虫中主要用于对html进行解析

2、路径表达式

表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性

3、匹配属性

通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。

4、安装

pip install lxml

5、使用流程

1. from lxml import etree
2. parseHtml = etree.HTML(html)
3. rList = parseHtml.xpath('表达式')

6、xpath匹配规则

1. 获取节点对象
     //div[@class="test"]
2. 获取节点属性值
     //div[@class="test"]//a/@src
3. 函数
     //div[contains(@class,"test")]/a/@href
4.获取节点对象内容
    //div/a/text()

7、属性多值匹配

某些节点的某个属性可能有多个值

from lxml import etree

text = '''
<li class="zxc  asd  wer"><a href="https://s2.bdstatic.com/">1 item</a></li>
<li class="ddd  asd  eee"><a href="https://s3.bdstatic.com/">2 item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "asd")]/a/text()')
print(result)

# 运行结果:['1 item', '2 item']

8、多属性匹配

当前节点有多个属性时,需要同时进行匹配

from lxml import etree

text = '''
<li class="zxc  asd  wer" name="222"><a href="https://s2.bdstatic.com/">1 item</a></li>
<li class="ddd  zxc  eee" name="111"><a href="https://s3.bdstatic.com/">2 item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "zxc") and @name="111"]/a/text()')
print(result)

# 运行结果:['2 item']

9、函数

  • 查找最后一个li标签里的a标签的href属性(last()函数
html = etree.HTML(text)
html_data = html.xpath('//li[last()]/a/text()')
print(html_data)
  • 查找倒数第二个li标签里的a标签的href属性
html_data = html.xpath('//li[last()-1]/a/text()')
print(html_data)

打印
['item 4 ']
from lxml import etree
print("------------")
text = '''
<div>
<ul>
    <li class="item-0"><a href="https://s1.bdstatic.com/">item 0 </a></li>
        <li class="item-1"><a href="https://s2.bdstatic.com/">item 1 </a></li>
        <li class="item-2"><a href="https://s3.bdstatic.com/">item 2 </a></li>
        <li class="item-3"><a href="https://s4.bdstatic.com/">item 3 </a></li>
        <li class="item-4"><a href="https://s5.bdstatic.com/">item 4 </a></li>
        <li class="item-5"><a href="https://s6.bdstatic.com/">item 5 </a></li>
</ul>
</div>
'''

html = etree.HTML(text)
# 获取第一个
result = html.xpath('//li[1]/a/text()')
print(result)
# 获取最后一个
result = html.xpath('//li[last()]/a/text()')
print(result)
# 获取前两个
result = html.xpath('//li[position()<3]/a/text()')
print(result)
# 获取倒数第三个
result = html.xpath('//li[last()-2]/a/text()')
print(result)

"""
运行结果:

['item 0 ']
['item 5 ']
['item 0 ', 'item 1 ']
['item 3 ']
"""

 

posted on 2022-07-19 17:16  司徒轩宇  阅读(661)  评论(0编辑  收藏  举报