外贸建站什么意思,合肥网站设计,如何网上开店卖东西,网站关键词免费优化文章目录 一、数据解析方式二、xpath介绍三、环境安装1. 插件安装2. 依赖库安装 四、xpath语法五、xpath语法在Python代码中的使用 一、数据解析方式
爬虫抓取到整个页面数据之后#xff0c;我们需要从中提取出有价值的数据#xff0c;无用的过滤掉。这个过程称为数据解析我们需要从中提取出有价值的数据无用的过滤掉。这个过程称为数据解析也叫数据提取。数据解析的方式有多种按照网站数据来源是静态还是动态进行分类如下
动态网站字典取值。动态网站的数据一般都是JS发过来的基本都是json格式数据我们只需要将json格式转换为字典进行取值。静态网站xpath取值 正则取值。
说明爬虫开发中用的最多的数据解析方式是字典取值和xpath取值占到80%以上其余的少部分是正则取值。
二、xpath介绍
xpath全称XML Path Language即XML路径语言。它是一门在XML文档中查找信息的语言最初是用来搜寻XML文档的但是它同样适用于HTML文档的搜索。
xpath的选择功能十分强大它提供了非常简明的路径选择表达式。另外它还提供了众多的内建函数用于字符串、数值、时间的匹配处理等几乎所有我们想要定位的节点都可以用XPath来选择。
三、环境安装
1. 插件安装
很多爬虫的初学者由于对解析工具语法的不熟练经常会有这种情况抓来的数据经过解析之后发现不是自己要的就会多次调试代码直至提取出精确的价值数据这样就会导致爬虫多次频繁请求网站结果自己的IP被网站封掉。那有没有好的办法规避这种情况呢
有的Chrome浏览器支持众多插件其中就有适合xpath语法的元素查找插件XPath Helper在谷歌应用商店可以搜索安装安装好之后图标如下图所示 使用该插件的方法很简单在Chrome浏览器中打开任意网页之后同时按下 CtrlShiftX 键就可以看到网页上方的XPath Helper调试窗口左边窗口是要输入的xpath语法右边窗口是该xpath语法定位出的结果展示。这样就非常方便我们写爬虫项目如果不确定解析出的结果是不是我们想要的就可以先在调试窗口中多次调试结果没有错误再直接把该代码复制到我们的爬虫代码中运行如下图 2. 依赖库安装
在Python代码中若要使用xpath解析需要安装lxml这个第三方库它对xpath语法提供了良好的支持安装lxml库步骤如下
1.同时按下win R键打开运行框在里面输入cmd点击确定。 2.来到控制台中输入安装命令pip install lxml -i https://mirrors.aliyun.com/pypi/simple/然后按下回车键等候安装完成出现“Successfully installed …”字样即为安装成功。 四、xpath语法
xpath语法也叫xpath路径表达式。因为xpath查找内容是按照HTML代码的标签树结构搜索的每一个标签都有自己的父标签和子标签比如下图这组HTML代码所示
bodydiva href/ershoufang/dongcheng/ title北京东城在售二手房 东城/aa href/ershoufang/xicheng/ title北京西城在售二手房 西城/aa href/ershoufang/chaoyang/ title北京朝阳在售二手房 朝阳/aa href/ershoufang/haidian/ title北京海淀在售二手房 海淀/a/div
/body代码中的 body 标签就是 div 标签的父标签同理div 标签是 body 标签的子标签。标签之间的这种父子关系用xpath语法表示的话就是用 / 分隔比如我们要找 a 标签xpath写法就是div/a或者 body/div/a。这种就类似我们的电脑上面文件路径表示方法故而xpath语法又叫xpath路径表达式。
看到上面这些有的小伙伴可能会纳闷既然找 a 标签干嘛不直接写 a 就行了怎么写这么多父子关系进行约束呢是不是多此一举了 没关系看看下面这组代码图片 如果说要在上面这组代码中找到高亮显示的这行 “2室1厅 | 53平米 | 南 北 | 精装 | 中楼层(共5层) | 板楼” 文字单单输入 span 标签能找到吗显然不能因为里面有多个 span 标签所以使用xpath路径表达式的用意就是希望使用标签的父子关系约束来精确定位到我们要找的那个标签。
讲了这么多接下来我们就看看xpath路径表达式的常用规则。使用xpath规则匹配查找的源码如下
bodydiva href/ershoufang/dongcheng/ title北京东城在售二手房 东城/aa href/ershoufang/xicheng/ title北京西城在售二手房 西城/aa href/ershoufang/chaoyang/ title北京朝阳在售二手房 朝阳/a/div
/body/ 表示两个相邻元素节点关系也可以说父子关系 用法示例如果要找上述代码中的 a 标签路径表达式为div/a 注意如果当前查找出来的标签有多个比如上面查找到的 a 标签有3个我们想要第2个写法就是 div/a[2]同理我们需要第几个标签就在标签后面加上[顺序值] // 表示两个不相邻元素节点关系也可以说爷孙这种隔代关系 用法示例还是从上述代码中找 a 标签路径表达式还可以写为body//a 注意// 也表示从任意位置开始检索而不考虑它们的位置。xpath查找标签的顺序正常是从HTML文档头部开始查找当一个HTML文档中标签非常多我们查找的标签位于文档的中间某位置。如果直接从头部标签开始一级级往下检索非常繁琐。用 “// 标签名” 就相当于从该标签开始检索书写。比如我们还是要找 a 标签可以写成 //a。 . 指代当前节点比如xpath路径表达式找到某个元素后想在此元素基础上往后面查找其他元素那么前面的路径表达式就可以省略用 . 替换 选取属性作用就是更精确定位某个标签 用法示例比如上面我们正常查找的 a 标签是有3个我们还是要找第2个 a 标签已经学了一种方法就是 a 标签后面加上[顺序值]。但是如果 a 标签有几十个呢我们就要一个个数顺序很繁琐也容易出错。这时候就可以通过标签自身的属性值来精确定位某个标签。我们仔细可以看出上面的每个 a 标签里面的 href 和 title 两个属性值都是彼此不同的那我们要找第2个可以这样写//a[href“/ershoufang/xicheng/”] 或者 //a[title北京西城在售二手房 ]。格式就是标签名[属性名属性值] text() 提取标签中的文本内容 用法示例上面的几种方式定位的都是某个标签如果要拿到标签中的详细内容比如要拿到第2个 a 标签的文本内容 “西城”这两个字写法是//a[title北京西城在售二手房 ]/text()。格式是标签/text() 注意/text()一定要写在标签及标签属性值后面因为属性值是修饰该标签的可以精确定位到某个标签其次后面才加/text()表示该标签的文本内容。当然定位的标签如果无需属性值作为修饰即可找到则直接就是标签名加上/text()。 属性名 提取标签内指定属性名的属性值 用法示例上面我们提取了标签的文本内容但是有时候可能需要提取标签内的某个属性名对应的属性值。比如要提取第2个 a 标签中 title 的属性值 “北京西城在售二手房” 这句话写法是//a[title北京西城在售二手房 ]/title 或者 //a[2]/title 都可以。格式是标签/属性名 以上就是开发中最常见的xpath表达式记住这些对于日后解析爬虫来说就完全够用了。当然xpath还有许多其他路径表达式有兴趣的小伙伴也可以额外探索。
五、xpath语法在Python代码中的使用
上面介绍的只是xpath路径表达式但是如何实际在Python代码中使用呢这就需要用到上面提到的依赖库 lxml 了。因为我们用爬虫抓取到的网页源码虽然是HTML文档但是其实是字符串类型的数据如下图抓取房源信息代码所示 而xpath解析的是html或者lxml文档中的标签元素对象不是字符串。我们就需要将抓到的字符串类型源码转换为html或者lxml文档中的标签元素对象然后就可以正常使用xpath路径表达式进行解析查找。
如何将字符串内容转换成标签元素对象要使用 lxml 库里面的 etree 模块中的 HTML() 方法语法格式如下
from lxml import etree # 导入 lxml 库中的 etree 模块
变量名 etree.HTML(网页源码) # 使用 etree 模块的 HTML() 方法括号中就是爬虫拿到的字符串类型的网页源码将转换后的标签对象用变量保存代码示例如下图所示 转换为标签元素对象之后就可以正常使用上面介绍的xpath路径表达式了语法格式如下
标签元素对象.xpath(路径表达式) # 标签元素对象就是我们刚刚转换好的括号里面的是双引号或者单引号都可以包裹的就是路径表达式代码示例如下图所示 注意在Python代码中xpath路径表达式最终拿到的解析结果是以列表形式返回的如果没有解析到目标数据结果为空列表。