【JS逆向基础】数据分析之XPATH
【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 reret = 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 etreewith 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)