一篇文章掌握网页解析神器——xpath
学爬虫不会xpath解析数据?
今天老师带你一堂课带你从零开始精通xpath,从此轻松提取网页信息。
我们在爬虫的过程中,经常会遇到html字符串数据,很多我们需要的数据不是作为标签的文本就是作标签的属性值那么这些隐藏在标签中我们需要的数据可以通过xpath语法给解析出来
PS:如果你处于想学Python或者正在学习Python,Python的教程不少了吧,但是是最新的吗?说不定你学了可能是两年前人家就学过的内容,在这小编分享一波2020最新的Python教程。获取方式,私信小编 “ 资料 ”,即可免费获取哦!
环境介绍:
python 3.6
pycharm
parsel(xpath)
爬虫数据解析的方法
正则表达式
使用场景:数据量相对较少,或者你要提取的诗句类型单一
转没人能用于从字符串里面提取数据
CSS选择器
使用场景:适合在HTML标签当中进行提取数据
css是叠层样示表,专门用于控制网页的颜色、样式与动画。而css选择器就是专门用来选择HTML的标签,进而进行数据提取
xpath
使用场景:合适在HTML标签当中进行数据提取
路径选择器,最早是提取xml文件,因为简单易学,在提取网页方面应用比较多
xpath中节点之间的关系
节点是什么东西?
每个html的标签我们都称之为节点。(根节点、子节点、同级节点)
xpath语法
xpath使用路径表达式来选取xml文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似
表达式
| nodename | :选中该元素。
| / | :从根节点选取、或者是元素和元素间的过渡。
| // | :从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。跨节点获取标签
| . |: 选取当前节点。
| .. | :选取当前节点的父节点。
| @ |: 选取属性。
| text() | :选取文本。
选取未知节点
| * | :匹配任何元素节点。
| @* | :匹配任何属性节点。
| node() |: 匹配任何类型的节点。
| /div/* | :选取 div元素的所有子元素。
| //* | :选取文档中的所有元素。
| //title[@*] |: 选取所有带有属性的 title 元素。
案例
str –> Selector对象 具有xpath方法 提取到的数据返回一个列表
import parsel html_str = """ <div> <ul> <li class="item-1"> <a href="link1.html">第一个</a> </li> <li class="item-2"> <a href="link2.html">第二个</a> </li> <li class="item-3"> <a href="link3.html">第三个</a> </li> <li class="item-4"> <a href="link4.html">第四个</a> </li> <li class="item-5"> <a href="link5.html">第五个</a> </li> </ul> </div> """
1、转换数据类型
data = parsel.Selector(html_str).extract() # parsel能够把缺失的html标签补充完成 data = parsel.Selector(html_str) # parsel能够把缺失的html标签补充完成
2、解析数据–list类型
print(data)
2、1 从根节点开始,获取所有<a>标签
result = data.xpath('/html/body/div/ul/li/a').extract()
2、2 跨节点获取所有<a>标签
result = data.xpath('//a').extract()
2、3 选取当前节点 使用场景:需要对选取的标签的下一级标签进行多次提取
result = data.xpath('//ul') result2 = result.xpath('./li').extract() # 提取当前节点下的<li>标签 result3 = result.xpath('./li/a').extract() # 提取当前节点下的<a>标签
2、4 选取当前节点的父节点,获取父节点的class属性值
result = data.xpath('//a') result4 = result.xpath('../@class').extract()
2、5 获取第三个<li>标签的节点(两种方法)
result = data.xpath('//li[3]').extract() result = data.xpath('//li')[2].extract()
2、6 通过定位属性的方法获取第四个<a>标签
result = data.xpath('//a[@href="link4.html"]').extract()
2、7 用属性定位标签,获取第四个<a>标签包裹的文本内容
result = data.xpath('//a[@href="link4.html"]/text()').extract()
2、8 获取第五个<a>标签的href属性值
result = data.xpath('//li[5]/a/@href').extract()
了解 模糊查询
result = data.xpath('//li[contains(@class,"it")]').extract()
同时获取<li>标签的属性以及<a>标签的文本
result = data.xpath('//li/@class|//a/text()').extract()
总结
1. xpath的概述XPath (XML Path Language),解析查找提取信息的语言
2. xpath的节点关系:根节点,子节点,同级节点
3. xpath的重点语法获取任意节点:`//`
4. xpath的重点语法根据属性获取节点:`标签[@属性 = ‘值’]`
5. xpath中获取节点的文本:`text()`
6. xpath的获取节点属性值:`@属性名`