完整的采集神器(Python学习资料下载地址(一):Xpath的使用方法)

优采云 发布时间: 2021-09-02 14:14

  完整的采集神器(Python学习资料下载地址(一):Xpath的使用方法)

  在github上找一个美团项目,可以获取到指定城市的商家信息,分分钟上百条商家信息数据在手,信息包括店铺名称、地理位置、评分、销量,电话(这就是重点)。

  好久没更新了。今天写了文章,附上这个很有价值的项目的下载地址。

  本文是自己写的xpath笔记。不想看的可以直接到文章最下面的代码下载地址。

  可惜项目是用scrapy写的。其实我是不想用框架的,但是把这个项目改成可以运行的代码,花了一天的时间。我在变更过程中再次熟悉了scrapy。决定学习xpath,然后我会用scrapy写几个爬虫。

  Python学习交流群:1004391443,这里是Python学习者的聚集地,有专家答疑资源分享!小编还准备了python学习资料,欢迎有想学习python编程,或转行,或大学生,以及想在工作中提高自己能力的,以及正在学习的人加入学习。

  除了css,scrapy的选择器比xpath好。现在需要练习xpath的使用。

  Xpath 简介

  一般来说,使用id、name、class等属性定位节点可以解决大部分解析需求,但有时在以下情况下,使用Xpath更方便:

  没有id、name、class等属性或者文字特征不明显。标签的嵌套层次太复杂。

  Xpath 是对 XML 路径的介绍。基于 XML 树结构,您可以在整个树中找到目标节点。由于 HTML 文档本身是一个标准的 XML 页面,我们可以使用 XPath 语法来定位页面元素。

  Xpath 定位方法

  一、Xpath 路径

  符号名称的含义/绝对路径表示从根节点选择//相对路径表示从任意位置选择一个节点,而不管它们的位置

  Xpath 路径示例

  定位节点

  #查找html下的body下的form下的所有input节点/html/body/form/input#查找所有input节点//input

  通配符 *选择未知节点

  #查找form节点下的所有节点//form/*#查找所有节点//*#查找所有input节点(input至少有爷爷辈亲戚节点)//*/input

  二、使用索引(这是我自己的理解)

  如果过滤元素时有多个节点,但我们想确定唯一的节点。您可以使用类似于列表索引的方式进行精确定位。

  案例

  #定位 第8个td下的 第2个a节点//*/td[7]/a[1]#定位 第8个td下的 第3个span节点//*/td[7]/span[2]#定位 最后一个td下的 最后一个a节点//*/td[last()]/a[last()]

  三、使用属性

  为了让定位更准确,类似于使用索引,我们需要增加信息量,所以我们也可以使用属性。 @Symbol 是一个属性符号

  #定位所有包含name属性的input节点//input[@name]#定位含有属性的所有的input节点//input[@*]#定位所有value=2的input节点//input[@value='2']#使用多个属性定位//input[@value='2'][@id='3']或者//input[@value='2' and @id='3']

  四、常用函数

  除了索引和属性,Xpath还可以使用方便的功能来提升定位的准确性。下面是几个常用的函数:

  函数的含义 contains(s1,s2) 如果s1收录s2,则返回true;否则返回falsetext()获取节点中的文本内容starts-with()从实际位置开始匹配字符串

  应用推广#定位href属性中包含“promote.html”的所有a节点//a[contains(@href,'promote.html')]#元素内的文本为“应用推广”的所有a节点//a[text()='应用推广']#href属性值是以“/ads”开头的所有a节点//a[starts-with(@href,'/ads')]

  五、Xpath轴

  这部分类似于BeautifulSoup中的sibling、parents和children方法。有时为了实现定位,需要绕道而行,七阿姨和八阿姨的远房亲戚四处走走相识,定位就完成了。

<p>轴名称含义ancestor选择当前节点的所有祖先(父亲、祖父等)ancestor-or-self选择当前节点的所有祖先(父亲、祖父等),当前节点自身属性选择所有当前节点的属性child选择当前节点的所有子节点descendant选择当前节点的所有后代(children,grandchildren等)descendant-or-self选择当前节点的所有后代(children,grandchildren等) .) 和当前节点自己的后续选择当前节点结束后的所有节点父节点选择当前节点的父节点前兄弟选择当前节点自身选择当前节点之前的所有同级节点

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线