首页 > 其他分享 >Day 11 11.1 Xpath解析

Day 11 11.1 Xpath解析

时间:2023-02-24 13:14:09浏览次数:42  
标签:11 Xpath xpath title class 元素 选取 div Day

xpath解析

xpath在Python的爬虫学习中,起着举足轻重的地位,对比正则表达式 re两者可以完成同样的工作,实现的功能也差不多,但xpath明显比re具有优势,在网页分析上使re退居二线。

xpath 全称为XML Path Language 一种小型的查询语言
xpath的优点:

  • 可在XML中查找信息
  • 支持HTML的查找
  • 通过元素和属性进行导航

python开发使用XPath条件: 由于XPath属于lxml库模块,所以首先要安装库lxml。

from lxml import etree
selector=etree.HTML(源码) #将源码转化为能被XPath匹配的格式
selector.xpath(表达式) #返回为一列表

【1】路径表达式

表达式 描述 实例 解析
/ 从根节点选取 /body/div[1] 选取根结点下的body下的第一个div标签
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 //a 选取文档中所有的a标签
./ 当前节点再次进行xpath ./a 选取当前节点下的所有a标签
@ 选取属性 //@calss 选取所有的class属性
from lxml import etree

html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""


selector = etree.HTML(html_doc)
print(type(selector)) #<class 'lxml.etree._Element'>
results = selector.xpath("//a")

print(results) # [<Element a at 0x2155de71640>, <Element a at 0x2155e3976c0>, <Element a at 0x2155e397800>]
for result in results:
    href = result.xpath('./@href')
    href1 = result.xpath('./@href')[0] #获取标签里的href值
    href2 = result.xpath('./text()')[0] #获取标签里的文本值
    print(href)#['http://example.com/elsie'] ['http://example.com/lacie'] ['http://example.com/tillie']
    print(href1)#http://example.com/elsie http://example.com/lacie http://example.com/tillie
    print(href2) #Elsie Lacie Tillie

【2】谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

路径表达式 结果
/ul/li[1] 选取属于 ul子元素的第一个 li元素。
/ul/li[last()] 选取属于 ul子元素的最后一个 li元素。
/ul/li[last()-1] 选取属于 ul子元素的倒数第二个 li元素。
//ul/li[position()❤️] 选取最前面的两个属于 ul元素的子元素的 li元素。
//a[@title] 选取所有拥有名为 title的属性的 a元素。
//a[@title='xx'] 选取所有 a元素,且这些元素拥有值为 xx的 title属性。
//a[@title>10] > < >= <= != 选取 a元素的所有 title元素,且其中的 title元素的值须大于 10。
/body/div[@price>35.00] 选取body下price元素值大于35的div节点

【3】选取未知节点

XPath 通配符可用来选取未知的 XML 元素。

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

实例

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式 结果
/ul/* 选取 bookstore 元素的所有子元素。
//* 选取文档中的所有元素。
//title[@*] 选取所有带有属性的 title 元素。
//node() 获取所有节点

【4】选取若干路径

通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

实例

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式 结果
//book/title | //book/price 选取 book 元素的所有 title 和 price 元素。
//title | //price 选取文档中的所有 title 和 price 元素。
/bookstore/book/title | //price 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。
  • 逻辑运算
//div[@id="head" and @class="s_down"] # 查找所有id属性等于head并且class属性等于s_down的div标签
//title | //price # 选取文档中的所有 title 和 price 元素,“|”两边必须是完整的xpath路径
  • 属性查询
//div[@id] # 找所有包含id属性的div节点
//div[@id="maincontent"]  # 查找所有id属性等于maincontent的div标签
//@class
//li[@name="xx"]//text()  # 获取li标签name为xx的里面的文本内容
  • 获取第几个标签 索引从1开始
tree.xpath('//li[1]/a/text()')  # 获取第一个
tree.xpath('//li[last()]/a/text()')  # 获取最后一个
tree.xpath('//li[last()-1]/a/text()')  # 获取倒数第二个
  • 模糊查询
//div[contains(@id, "he")]  # 查询所有id属性中包含he的div标签
//div[starts-with(@id, "he")] # 查询所有id属性中包以he开头的div标签

//div/h1/text()  # 查找所有div标签下的直接子节点h1的内容
//div/a/@href   # 获取a里面的href属性值 
//*  #获取所有
//*[@class="xx"]  #获取所有class为xx的标签

# 获取节点内容转换成字符串
c = tree.xpath('//li/a')[0]
result=etree.tostring(c, encoding='utf-8')
print(result.decode('UTF-8'))

【5】案例

豆瓣Top250基于xpath解析:

import requests
from lxml import etree

url = "https://movie.douban.com/top250?start=0"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36"
}
resp = requests.get(url, headers=headers)

tree = etree.HTML(resp.text)  # 加载页面源代码

items = tree.xpath('//li/div[@class="item"]/div[@class="info"]')

for item in items:
    title = item.xpath('./div[@class="hd"]/a/span[1]/text()')[0]
    rating_num = item.xpath('./div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()')[0]
    comment_num = item.xpath('./div[@class="bd"]/div[@class="star"]/span[4]/text()')[0]
    print(title, rating_num, comment_num)

练习:基于xpath完成解析练习

import requests
from lxml import etree

res = requests.get("https://top.baidu.com/board?platform=pc&sa=pcindex_entry", )

selector = etree.HTML(res.text)

rets = selector.xpath('//div[@theme="car"]//div[contains(@class,"item-wrap_Z0BrP ")]')

info = {}
for i in rets:
    name = i.xpath('./div[@class="normal_1glFU"]/a/text()')
    link = i.xpath('./div[@class="normal_1glFU"]/a/@href')
    info[name[0]] = link[0]

print(info)
print(len(info))

标签:11,Xpath,xpath,title,class,元素,选取,div,Day
From: https://www.cnblogs.com/dream-ze/p/17151030.html

相关文章

  • Day 11 11.2 文件操作
    文件操作引言到目前为止,我们做的一切操作,都是在内存里进行的,这样会有什么问题吗?如果一旦断电或发生意外关机了,那么你辛勤的工作成果将瞬间消失。是不是感觉事还挺大的呢......
  • 【YBT2023寒假Day14 C】字符串题(SAM)(树链剖分)(线段树)
    字符串题题目链接:YBT2023寒假Day14C题目大意对于一个字符串S定义F(S)是fail树上除了0点其它点的深度和。G(S)是S每个子串S'的F(S')之和。然后一个空......
  • 【Redis】011-Redis主从复制:Redis集群环境搭建、主从复制之复制原理及手动配置主机
    目录​​一、Redis集群环境搭建​​​​1、概念​​​​2、主从复制的作用​​​​3、为什么一般使用多台Redis服务器​​​​4、为什么使用集群​​​​5、环境配置​​​......
  • 【YBT2023寒假Day14 B】二进制数(数位DP)(数学)
    二进制数题目链接:YBT2023寒假Day14B题目大意问你[A,B]之间有多少个整数,满足它二进制表示下(不要前导0)子串00,01,10,11个数分别是a,b,c,d。其中A,B<=2^{100000},a......
  • centos8 安装mysql8.0.11—shell自动化脚本
    需求说明自动化安装mysql8.0.11并修改密码为指定字符并根据提供的sql文件创建以文件名为名称的数据库并执行sql文件下载压缩包下载地址流程总览:1.将压缩包上传到......
  • Day01-Markdown学习
    Markdown学习要看具体格式可在安装Typora中在点击“启动源代码模式”标题:一级标题:#+空格+标题,二级标题:##+空格+标题,三级四级标题同理 字体Hello,World!(字体两边......
  • 【YBT2023寒假Day14 A】切割蛋糕(计算几何)
    切割蛋糕题目链接:YBT2023寒假Day14A题目大意给你一个圆,圆心在原点,每次有一条直线,切掉圆中不包含原点的部分。(直线给出的部分是它在于圆两个交点形成的线段的垂直平分......
  • docker 安装rabbitmq3.11-management
    1,dockerpullrabbitmq:3.11-managementmanagement版本表示带有web管理后台2,创建映射目录mkdir-p/docker/rabbitmq/data3,启动dockerrun-p5672:5672-p15672......
  • 刷刷刷 Day 36 | 435. 无重叠区间
    435.无重叠区间LeetCode题目要求给定一个区间的集合 intervals ,其中intervals[i]=[starti,endi] 。返回需要移除区间的最小数量,使剩余区间互不重叠 。示例输......
  • Day 22 22.2:scrapy部署
    scrapy项目部署scrapyd部署工具介绍scrapyd是一个用于部署和运行scrapy爬虫的程序,它由scrapy官方提供的。它允许你通过JSONAPI来部署爬虫项目和控制爬虫运行。所......