【JS逆向基础】数据分析之XPATH

发布于:2025-07-11 ⋅ 阅读:(19) ⋅ 点赞:(0)

【JS逆向基础】数据分析之正则表达式-CSDN博客

【JS逆向基础】数据分析 之 BS4-CSDN博客

这里接续前面的两篇文章介绍关于数据分析的第三个工具XPATH,


XPATH

1,简介

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

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

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

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

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

2,路径表达式

3,谓语

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

谓语被嵌在方括号中。

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

4,选取未知节点

#注意:一般引号之间的引号用单引号代替,否则会报错误处理

#1,逻辑运算
//div[@id="head" and eclass="s_dow"]# 查找所有id属性等于head并且class属性等于s_down的div标签
//title|//price # 选取文档中的所有 title 和 price 元素, ""两边必须是完整的xpath路径
#2,属性查询
//div[@id]# 找所有包含id属性的div节点
//div[@id="maincontent"]# 查找所有id属性等于maincontent的div标签
//@class
//li[@name="xx"]//text() # 获取li标签name为xx的里面的文本内容
#3,获取第几个标签 索引从1开始
tree.xpath('//li[1]/a/text()')#获取第一个
tree.xpath('//li[last()]/a/text()')#获取最后一个
tree.xpath('//li[last()-1]/a/text()')#获取倒数第二个
#4,模糊查询
//div[contains(@id,"he")]# 查询所有id属性中包含he的div标签
//div[starts-with(@id,"he")〕# 查询所有id属性中包以he开头的div标签
//div/h1/text() #查找所有div标签下的直接子节点h1的内容
//div/a/ehref#获取a里面的href属性值//* #获取所有
//*[@class-"xx"]      #获取所有class为xx的标签

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

 5,实例

将一个HTML界面中的电影名字与评分全部提取出来

#将一个HTML界面中的电影名字与评分全部提取出来

with open("豆瓣250.html",'r', encoding='utf-8') as f:
    s = f.read()
    # print(s)

import re

ret = re.findall("<table width=\"100%\" class=\"\">.*?<td width=\"100\" valign=\"top\">.*?title=\"(.*?)\".*?</td>.*?<span class=\"rating_nums\">(.*?)</span>", s, re.S)

print(ret)
print(len(ret))

 另一种写法

from lxml import etree

with open("../豆瓣250.html",'r', encoding='utf-8') as f:
    data = f.read()

print(type(data))
selector = etree.HTML(data)     #将源码转化为能被xPath匹配的格式
print(type(selector))

ret = selector.xpath('//div[@class="indent"]/div/table[@width="100%"]')        #返回为一列表

m_datas = []
for i in ret:
    movie_name = i.xpath('./tbody/tr/td[1]/a[@class="nbg"]/@title')
    movie_sore = i.xpath('./tbody/tr/td[2]/div/div/span[@class="rating_nums"]/text()')
    print(movie_name,movie_sore)

网站公告

今日签到

点亮在社区的每一天
去签到