Python爬虫之XPath语法和lxml库的用法

本来打算写的标题是 XPath 语法,但是想了一下 Python 中的解析库 lxml,使用的是 Xpath 语法,同样也是效率比较高的解析方法,所以就写成了 XPath 语法和 lxml 库的用法

安装

为什么要用这个库呢,因为要写爬虫啊,利用 lxml 库来解析 HTML 代码,同时 lxml 也继承了 libxml2 的特性自动修正 HTML 代码,利用pip安装即可

pip install lxml

XPath 语法

XPath 是一门在 XML 文档中查找信息的语言,可以用于在 XML 文档中通过元素和属性进行导航

举个栗子 😎

我们可以使用 XPath 提取网站地图中的所有链接,也就是说可以使用 XPath 去找我们 HTML 中的一些具体的东西

节点关系

在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)

再举个栗子 😎

<urlset>
<url>
<loc>https://qq52o.me</loc>
<lastmod>2018-04-28T19:00:42+00:00</lastmod>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>
</urlset>

第一个:父(Parent)

每个元素以及属性都有一个父

url元素是 loclastmodchangefreq以及 priority元素的父

第二个:子(Children)

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

loclastmodchangefreq以及 priority元素都是url元素的子

第三个:同胞(Sibling)

拥有相同的父的节点

loclastmodchangefreq以及 priority元素都是url元素的同胞

第四个:先辈(Ancestor)

某节点的父、父的父,等等

loc元素的先辈是 url元素和 urlset元素

第五个:后代(Descendant)

某个节点的子,子的子,等等

urlset的后代是urlloclastmodchangefreq以及 priority元素

如果你分不清楚,就按照子元素从上到下的去找元素节点

选取节点

XPath 使用路径表达式在 XML 文档中选取节点,节点是通过沿着路径或者 step 来选取的,也就是上面所说的按照子元素从上到下去找元素节点

这些是最有用的路径表达式 💡

表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

实例

路径表达式 结果
urlset 选取 urlset 元素的所有子节点
/urlset 选取根元素 urlset
urlset/url 选取属于 urlset 的子元素的所有 url 元素
//url 选取所有 url 子元素,而不管它们在文档中的位置
urlset//url 选择属于 urlset 元素的后代的所有 url 元素,而不管它们位于 urlset 之下的什么位置
//@href 选取名为 href 的所有属性

其他 XPath 语法请参考w3school

XPath 实例测试

提取本站网站地图中 id 属性为 content 的的子元素 h3 的内容以及子元素 a 的 href 属性,F12 去看代码找这个属性

提取本站网站地图 id 属性为 content 的=的子元素 h3 的内容

div 的 id 属性,下面的子元素 h3 的内容,直接利用 text 方法来获取元素的内容,然后输出

提取本站网站地图 id 属性为 content 的子元素 a 的 href 属性

这里的子元素层级关系必须按顺序写好,不然会报错的

IndexError: list index out of range

这就说明你的 XPath 规则没写好,list 是一个空的,没有一个元素

XPath 是一个非常好用的解析方法,同时也是作为爬虫学习的基础

5 条评论

发表评论

*