jquery抓取网页内容(Xpath:简单易用的网页内容提取工具学习爽,一直学习一直爽!)
优采云 发布时间: 2022-04-10 23:37jquery抓取网页内容(Xpath:简单易用的网页内容提取工具学习爽,一直学习一直爽!)
Xpath:一个易于使用的网页内容提取工具
学习一时爽,学习永远爽!
大家好,我是康纳,一个从零开始的技术新手。上次我们讲了如何使用请求。在上一课中,我们已经学习了所有常见的 Python 访问库。那么当我们得到我们访问的内容时,我们应该从网页中提取出我们想要的内容。因此,今天我们就来聊一聊常用的网页内容提取工具之一:Xpath。与 BeautifulSoup 相比,Xpath 更易于使用。
1.Xpath 简介
Xpath 是一种用于在 XML 文档中查找信息的语言。XPath 用于浏览 XML 文档中的元素和属性。他是一种路径语言(XML Path Language),用来确定一个XML文档的某一部分的位置。
XPath 基于 XML 的树结构,它提供了在数据结构树中查找节点的能力。XPath 的初衷是将其用作 XPointer 和 XSL 之间的通用语法模型。但是 XPath 很快被开发人员采用,并被广泛用作小型*查询语言。例如,当您打开网页并按 F12 进行元素检查时。当要复制元素的路径时,可以通过右键进行复制操作。您将在里面找到 Copy Xpath 的选项。这显示了 Xpath 的广泛使用。
说了这么多Xpath的使用范围有多大,使用起来有多么简单,让我们开始做正事,看看Xpath是如何在Python爬虫中用来爬取我们想要的内容的:
2. Xpath 安装
在之前的教程中,我几乎没有提到某个库的安装,但为什么我在这里提到如何安装呢?原因很简单,Xpath 只是 lxml 库中的一个模块。许多 Python 库都提供了 Xpath 函数,但最基本的是 lxml 库。最有效率。所以,你知道,要使用 Xpath,你需要安装 lxml 库:
pip install lxml
复制代码
3.Xpath 语法
其实说白了,Xpath就是从html中选择节点。通过以下路径或步骤选择节点。下面,我们将通过以下HTML文档进行演示:
html_doc ="""
总裁的新鲜小妻子
斗神天下
"""
复制代码
首先大家都知道,我们实际上从网页中得到的是字符串格式。所以如果我们想通过 Xpath 提取我们想要的东西,我们首先需要生成 HTML DOM 树:
from lxml import etree
page = etree.HTML(html_doc)
复制代码
3.1 路径查找
如果我们要使用寻路,我们首先需要知道 Xpath 的语法。Xpath的主要语法如下:
表达式描述
节点名
选择名为nodename的子节点
/
从根节点挑选
//
从与选择匹配的当前节点中选择文档中的节点,而不考虑它们的位置。
.
选择当前节点
..
选择当前节点的父节点
@
选择属性
In [1]: page.xpath('head')
Out[1]: []
复制代码
当前节点位置在html中,所以可以直接查询头节点,li是html的孙子节点,如果查询li则返回空值:
In [2]: page.xpath('li')
Out[2]: []
复制代码
In [3]: page.xpath('/html')
Out[3]: []
复制代码
从根节点搜索,根节点下只有一个节点html节点,所以从根节点只能找到html,如果搜索其他内容,会返回一个空列表:
In [4]: page.xpath('/li')
Out[4]: []
复制代码
In [5]: page.xpath('//li')
Out[5]:
[,
,
,
]
复制代码
从整个文档中查找在整个文档中查找符合条件的节点,包括孙节点及以下。
In [6]: page.xpath('//li')[0].xpath('..')
Out[6]: []
复制代码
In [7]: page.xpath('//a')[1].xpath('@href')
Out[7]: ['/book_16860.html']
复制代码
选中属性支持任意标签属性,但需要注意的是,如果选中的节点有多个,需要指定是哪个节点的属性。
3.2 节点查找
通过路径找到节点后,我们需要从超级找到的节点中选择我们需要的内容。还有一些查找节点的语法,如下:
表达结果
节点名[索引]
选择满足要求的第 index 个元素
节点名[last()]
选择最后一个元素
节点名[位置()
选择前 num 个元素
节点名[@attribute]
选择属性名为attribute的元素
节点名[@attribute='值']
选择具有属性名称属性和值值的元素
In [1]: page.xpath('//li[1]/a[1]/img[1]/@src')
Out[1]: ['/16860s.jpg']
复制代码
**注意:选择节点的属性时需要注意一件事。[index] 选择的节点是每个条件的第 [index] 个合格元素。**不过这个比较抽象,举个例子吧。例如:
In [2]: page.xpath('//li[1]') 选取所有符合 li 节点的第一个节点
Out[2]: []
复制代码
从上面的例子中,我们似乎什么都看不到,那么我们来看下面的例子:
In [3]: page.xpath('//li//img[1]')
Out[3]: [,
,
,
]
复制代码
如您所见,我们选择了 4 个 img 节点。原因很简单,看下面的代码和解释就明白了:
(一)
(二)
(三)
总裁的新鲜小妻子
(四)
(五)
(六)
斗神天下
复制代码
(一) 是第一个节点中的第一个节点
节点。它的路径是 //
(二) 是第一个节点的
首先在节点
节点。它的路径是/
. (三) 没有被选中,因为它是标签下的第二个
标签 (四) (五) (六)类似
In [4]: page.xpath('//img[position()>1]')
Out[4]: [, ]
复制代码
3.3 匹配未知节点
当我们匹配时,会有一条不确定的路径。此时,我们将涉及匹配未知节点。匹配未知节点也有对应的语法,如下:
通配符说明
*
匹配任何元素节点
@*
匹配任何属性节点
匹配任意属性节点:
In [1]: page.xpath('//li/a/*')
Out[1]: [,
,
,
]
复制代码
匹配任何元素节点:
In [2]: page.xpath('//li/a[@*]')
Out[2]: [,
,
,
]
复制代码
3.4 获取节点中的文本
可以通过attribute方法获取属性中的内容,但无法获取节点之间的内容。这时可以通过 text() 和 string() 方法获取其中的文本:
使用 text() 获取节点中的文本:
In [1]: page.xpath('//li/a[3]/text()')
Out[1]: ['总裁的新鲜小妻子', '斗神天下']
复制代码
如您所见,标签之间的文本可以通过 text() 属性轻松获取。
使用 string() 获取节点中的文本:
In [1]: page.xpath('string(//li[1]/a[3])')
Out[1]: '总裁的新鲜小妻子'
复制代码
3.5 选择多个路径
有时我们需要同时查找多个条件。此时,您可以通过在路径表达式中使用竖线字符(“|”)来选择多个路径:
In [1]: page.xpath('//li[1]/img[2]/@src | //li[1]/a[3]/text()')
Out[1]: ['/kukuku/images/second.png', '总裁的新鲜小妻子']
复制代码
同时选择多条路径不会生成新的列表,只会生成一个列表,所以你需要考虑如何提取你返回的结果。一般来说,不建议使用多个条件进行搜索,因为将多个提取结果混合在一个列表中不利于提取。即使可以提取,也会增加计算量,降低程序性能。所以,尽量不要使用这种方法。
下一条通知:
Xpath用起来还是那么费劲,有没有其他更简单的方法?? ? 当然有,你可以用美味的汤完成你需要做的事情。敬请关注下一期 - BeautifulSoup:美味汤
以上就是所有Xpath相关的内容了,可能没有其他的详细,但是对于你作为爬虫使用来说已经足够了。其实我也希望能详细一点,不过我是常客,个人不太喜欢用Xpath。如果你真的想深入了解 Xpth,我建议你去 W3C Xpath 教程 >>> 看看他们是如何使用它的。
好了,今天就到这里,我是康纳,一个从零开始的技术菜鸟。不知道你今天收获了多少?? ? 下次见!
学习一时爽,学习永远爽!
系列文章连接:
Python爬虫十六种形式——第一种形式:HTTP协议>>>
Python爬虫十六式二:urllib和urllib3 >>>
Python爬虫十六式-第三式:Requests的用法>>>
Python爬虫十六-五:BeautifulSoup,美味的汤>>>
Python爬虫十六式六:JQuery的假兄弟-pyquery >>>
Python爬虫十六式七:正则美术>>>
Python爬虫十六式——第八式:实例分析——全书网>>>
转载于: