广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python 爬虫网页内容提取工具xpath
  • 359
分享到

Python 爬虫网页内容提取工具xpath

2023-06-02 06:06:53 359人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

上一节,我们详述了lxml.html的各种操作,接下来我们熟练掌握一下XPath,就可以熟练的提取网页内容了。XPath 是什么?XPath的全称是 XML Path Language,即XML 路径语言,是一种在XML(HTML)文档中查

上一节,我们详述了lxml.html的各种操作,接下来我们熟练掌握一下XPath,就可以熟练的提取网页内容了。

XPath 是什么?

XPath的全称是 XML Path Language,即XML 路径语言,是一种在XML(HTML)文档中查找信息的语言。它有4点特性:

  • XPath 使用路径表达式在 XML 文档中进行导航
  • XPath 包含一个标准函数库
  • XPath 是 XSLT 中的主要元素
  • XPath 是一个 W3C 标准

Python 爬虫网页内容提取工具xpath

我们从网页中提取数据,主要应用前两点。

XPath 路径表达式

使用XPath我们可以很容易定位到网页中的节点,也就是找到我们关心的数据。这些路径跟电脑目录、网址的路径很相似,通过/来表示路径的深度。

XPath 标注函数库

头内建了100多个函数,当然我们提取数据用到的有限,也就不用记住全部100多个函数了。

Xpath 的节点(node

XPath中的核心就是节点(Node),定义了7种不同类型的节点: 元素(Element)、属性(Attribute)、文本(Text)、命名空间(Namespace)、处理指令(processing-instruction)、注释(Comment)和文档节点(Document nodes)
这些节点组成一棵节点树,树的根节点被称为文档节点。
其中注释就是html里面的注释:``
而命名空间、处理指令和网页数据提取基本没关系,这里就不再详述。

下面我们以一个简单的html文档为例,来解释不同的节点及其关系。

<html> <body>     <div>ABC</div>     <ul id="menu">         <li>home</li>         <li>python</li>     </ul> </body> </html>

这段html中的节点有:

  • 文档节点: <html>
  • 元素节点:<li>Python</li>
  • 属性节点: id="menu"

XPath 节点的关系

节点间的关系完全照搬人类传宗接代的辈分关系,但只是直系关系,没有叔叔、大伯之类的旁系关系。
还是以上面的html文档为例来说明节点关系:

父(Parent)

每个元素节点(Element)及其属性都有一个父节点。
比如,body的父是html,而body是div、ul 的父亲。

子(Children)

每个元素节点可以有零个、一个或多个子。
比如,body有两个子:div,ul,而ul也有两个子:两个li。

同辈(Sibling)

同辈有相同的父辈节点。
比如,div和ul是同辈。

先辈(Ancestor)

某节点的父辈及其以上辈分的节点。
比如,li的父辈有:ul、div、body、html

后代(Descendant)

某节点的子及其子孙节点。
比如,body的后代有:div、ul、li。

XPath节点的选取

选取节点,也就是通过路径表达来实现。这是我们在网页提取数据时的关键,要熟练掌握。

下表是比较有用的路径表达式:

表达式说明
nodename选取当前节点的名为nodename的所有子节点。
/从根节点选取,在路径中间时表示一级路径
//从当前节点开始选择文档中的节点,可以是多级路径
.从当前节点开始选取
..从父节点开始选取
@按属性选取

接下来通过具体的示例来加深对路径表达的理解:

路径表达式解释
/html/body/ul/li从根节点开始依照路径选取li元素。返回多个。
//ul/li[1]还是选取li元素,但是路径多级跳跃到ul/li。[1]表示只取第一个li。
//li[last()]还是选取li,但路径更跳跃。[last()]表示取最后一个li元素。
//li[@class]选取根节点的名为li且有class属性的所有后代。
//li[@class=”item”]选择根节点的名为li且class属性为item的所有后代。
//body/*/li选取body的名为li的孙子节点。*是通配符,表示任何节点。
//li[@*]选取所有带属性的li元素。
//body/div `` //body/ul选取body的所有div和ul元素。
body/div相对路径,选取当前节点的body元素的子元素div。绝对路径以 / 开始。

XPath函数

Xpath的函数很多,涉及到错误、数值、字符串、时间等等,然而我们从网页中提取数据的时候只会用到很少的一部分。其中最重要的就是字符串相关的函数,比如contains()函数。

contains(a, b)

如果字符串a包含字符串b,则返回true,否则返回false。
比如: contains(‘猿人学Python’, ‘Python’),返回true
那么它用在什么时候呢?我们知道,一个html标签的class是可以有多个属性值的,比如:

<div class="post-item text-red text-center">     ... </div>

这段html中div有三个class值,第一个表面它是一条发布的消息,后面两个是对格式做了更多的设置。如果我们想提取网页中所有发布的消息,只需要匹配到post-item 即可,这时候就可以用上contains了:

doc.xpath('//div[contains(@class, "post-item")]')

跟contains()类似的字符串匹配的函数还有:

  • starts-with(string1, string2) 判断string1是否以string2开头
  • ends-with(string1, string2) 判断string1是否以string2结尾
  • matches(string, pattern) 通过正则表达式匹配

然而,在lxml的xpath中使用ends-with(), matches() 会报错

In [232]: doc.xpath('//ul[ends-with(@id, "u")]') --------------------------------------------------------------------------- XPathEvalError                            Traceback (most recent call last) <ipython-input-232-79a4afc46a75> in <module>() ----> 1 doc.xpath('//ul[ends-with(@id, "u")]') src/lxml/etree.pyx in lxml.etree._Element.xpath() src/lxml/xpath.pxi in lxml.etree.XPathElementEvaluator.__call__() src/lxml/xpath.pxi in lxml.etree._XPathEvaluatorBase._handle_result() XPathEvalError: UnreGIStered function

lxml 竟然不支持ends-with(), matches()函数
到lxml官方网站去看看,原来它说了只支持 XPath 1.0:

lxml supports XPath 1.0, XSLT 1.0 and the EXSLT extensions through libxml2 and libxslt in a standards compliant way.

接着又在Wikipedia上找到Xpath 2.0 和 1.0 的差异对比,果然ends-with(), matches() 只属于2.0。下图中,粗体部分是1.0包含的,其它是2.0也有的:

Python 爬虫网页内容提取工具xpath
XPath 2.0 和 1.0 的差异

好了,Xpath在网页内容提取中要用到的部分已经讲完了

--结束END--

本文标题: Python 爬虫网页内容提取工具xpath

本文链接: https://www.lsjlt.com/news/229136.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python 爬虫网页内容提取工具xpath
    上一节,我们详述了lxml.html的各种操作,接下来我们熟练掌握一下XPath,就可以熟练的提取网页内容了。XPath 是什么?XPath的全称是 XML Path Language,即XML 路径语言,是一种在XML(HTML)文档中查...
    99+
    2023-06-02
  • python爬虫爬取bilibili网页基本内容
    用爬虫爬取bilibili网站排行榜游戏类的所有名称及链接: 导入requests、BeautifulSoup import requests from bs4 import Be...
    99+
    2022-11-12
  • python爬虫中如何爬取网页新闻内容
    小编给大家分享一下python爬虫中如何爬取网页新闻内容,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python可以做什么Python是一种编程语言,内置了许多...
    99+
    2023-06-14
  • Python爬虫网页,解析工具lxml.html(二)
    【前情回顾】如何灵活的解析网页,提取我们想要的数据,是我们写爬虫时非常关心和需要解决的问题。从Python的众多的可利用工具中,我们选择了lxml的,它的好我们知道,它的妙待我们探讨。前面我们已经从HTML字符串转换成的HtmlElemen...
    99+
    2023-06-02
  • Python 爬虫网页,解析工具lxml.html(一)
    狭义上讲,爬虫只负责抓取,也就是下载网页。而实际上,爬虫还要负责从下载的网页中提取我们想要的数据,即对非结构化的数据(网页)进行解析提取出结构化的数据(有用数据)。比如,我们要抓取了一个新闻页面的网页(html)下来,但我们想要的是这个网页...
    99+
    2023-06-02
  • Python网络爬虫项目:内容提取器的定义
    1. 项目背景 在python 即时网络爬虫项目启动说明中我们讨论一个数字:程序员浪费在调测内容提取规则上的时间,从而我们发起了这个项目,把程序员从繁琐的调测规则中解放出来,投入到更高端的数据处理工作中。...
    99+
    2022-06-04
    爬虫 定义 项目
  • python怎么爬取网页内的指定内容
    要爬取网页内的指定内容,可以使用Python中的第三方库,如BeautifulSoup和Requests。首先,需要安装这两个库。使...
    99+
    2023-08-08
    python
  • Python怎么爬取网页内容并存储
    本篇内容介绍了“Python怎么爬取网页内容并存储”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言想必大家都爬取过各个网站上首页上的东西把...
    99+
    2023-06-02
  • 【Python】提取网页正文内容的相关模
      【Python】提取网页正文内容的相关模块与技术   1、正文抽取地址   https://github.com/buriy/python...
    99+
    2023-01-31
    网页 内容 正文
  • python实现精准搜索并提取网页核心内容
    目录各种尝试生成PDF提取文章内容选择最优总结参考资料 文 | 李晓飞 来源:Python 技术「ID: pythonall」 爬虫程序想必大家都很熟悉了,随便写一个就可以...
    99+
    2022-11-12
  • 怎么用python实现精准搜索并提取网页核心内容
    这篇文章主要讲解了“怎么用python实现精准搜索并提取网页核心内容”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用python实现精准搜索并提取网页核心内容”吧!生成PDF开始想了一个...
    99+
    2023-06-25
  • python通过selenium爬取网页信息,python获取浏览器请求内容,控制已经打开的浏览器
    背景:通过python中直接get或者urlopen打开一些有延迟加载数据的网页,会抓取不到部分信息。 1. 命令行打开chrome,并开启调试端口(前提,找到chrome安装目录,找到chrome....
    99+
    2023-09-03
    python selenium chrome 爬虫
  • python爬取bilibili网页排名,视频,播放量,点赞量,链接等内容并存储csv文件中
    首先要了解html标签,标签有主有次,大致了解以一下,主标签是根标签,也是所有要爬取的标签的结合体 先了解一下待会要使用代码属性: #获取属性 a.attrs  获取a所有的属性和...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作