网页内容抓取工具(XPath的节点(Node)中的核心就是节点及其关系)

优采云 发布时间: 2022-03-26 09:04

  网页内容抓取工具(XPath的节点(Node)中的核心就是节点及其关系)

  在上一节中,我们详细介绍了 lxml.html 的各种操作。接下来,我们精通XPath,就可以熟练的提取网页内容了。

  

  什么是 XPath?

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

  

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

  XPath 路径表达式

  使用XPath,我们可以很方便的定位到网页中的节点,也就是找到我们关心的数据。这些路径与计算机目录和 URL 的路径非常相似,路径的深度用 / 表示。

  XPath 注释库

  标头中有 100 多个内置函数。当然,我们用来提取数据的数据是有限的,所以我们不需要记住所有 100 多个函数。

  Xpath 的节点

  XPath的核心是节点(Node),它定义了7种不同类型的节点:元素(Element)、属性(Attribute)、文本(Text)、命名空间(Namespace)、处理指令(processing-instruction)、注释(Comment ) 和文档节点

  这些节点组成一个节点树,树的根节点称为文档节点。

  注释是html中的注释:

  命名空间、处理指令和网页数据提取基本无关,这里不再详述。

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

  

ABC

home

python

  此 html 中的节点是:

  XPath 节点的关系

  节点之间的关系完全复制了人类的代际关系,但只是直接关系,没有叔叔叔叔之类的旁系关系。

  或者以上面的html文档为例来说明节点关系:

  家长

  每个元素节点(Element)及其属性都有一个父节点。

  比如body的parent是html,body是div和ul的parent。

  孩子们

  每个元素节点可以有零个、一个或多个子节点。

  例如,body 有两个孩子:div、ul,而 ul 也有两个孩子:两个 li。

  兄弟

  兄弟姐妹具有相同的父节点。

  例如, div 和 ul 是兄弟姐妹。

  祖先

  一个节点的父节点和上面几代的节点。

  比如li的父母是:ul, div, body, html

  后裔

  节点的子节点及其后代节点。

  比如body的后代有:div、ul、li。

  XPath 节点的选择

  选择节点是通过路径表达式来实现的。这是我们从网页中提取数据的关键,一定要熟练掌握。

  下表是一个有用的路径表达式:

  

  接下来,我们将通过具体的例子加深对路径表达的理解:

  

  XPath 函数

  Xpath的功能很多,涉及到错误、值、字符串、时间等,但是我们在从网页中提取数据的时候只用到了几个。其中最重要的是与字符串相关的函数,例如 contains() 函数。

  收录(a,b)

  如果字符串 a 收录字符串 b,则返回 true,否则返回 false。

  例如: contains('猿人学 Python', 'Python'),返回 true

  那么什么时候使用呢?我们知道一个html标签的类可以有多个属性值,比如:

  

...

  这个html中的div有三个class值,第一个表示是发布的消息,后两个是更多的格式设置。如果我们想提取网页中所有发布的消息,我们只需要匹配post-item,那么我们可以使用contains:

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

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

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

  In [232]: doc.xpath('//ul[ends-with(@id, "u")]')

---------------------------------------------------------------------------

XPathEvalError Traceback (most recent call last)

in ()

----> 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 不支持 end-with()、matches() 函数

  去lxml官方网站看,原来只支持XPath1.0:

  lxml 以符合标准的方式通过 libxml2 和 libxslt 支持 XPath 1.0、XSLT 1.0 和 EXSLT 扩展。

  然后我在维基百科上找到了Xpath 2.0 和1.0 的区别,果然ends-with(),matches() 只属于2.0。下图中,粗体部分收录在1.0中,其他部分也收录在2.0中:

  

  

  好了,我们已经学习完了Xpath 在Web 内容提取中使用的部分。在下一节中,我们将通过一个示例来说明从 xpath 中提取数据的过程。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线