本来打算写的标题是 XPath 语法,但是想了一下 Python 中的解析库 lxml,使用的是 Xpath 语法,同样也是效率比较高的解析方法,所以就写成了 XPath 语法和 lxml 库的用法
为什么要用这个库呢,因为要写爬虫啊,利用 lxml 库来解析 HTML 代码,同时 lxml 也继承了 libxml2 的特性自动修正 HTML 代码,利用pip
安装即可
pip install lxml
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
元素是 loc
、lastmod
、changefreq
以及 priority
元素的父
第二个:子(Children)
元素节点可有零个、一个或多个子
loc
、lastmod
、changefreq
以及 priority
元素都是url
元素的子
第三个:同胞(Sibling)
拥有相同的父的节点
loc
、lastmod
、changefreq
以及 priority
元素都是url
元素的同胞
第四个:先辈(Ancestor)
某节点的父、父的父,等等
loc
元素的先辈是 url
元素和 urlset
元素
第五个:后代(Descendant)
某个节点的子,子的子,等等
urlset
的后代是url
、loc
、lastmod
、changefreq
以及 priority
元素
如果你分不清楚,就按照子元素从上到下的去找元素节点
XPath 使用路径表达式在 XML 文档中选取节点,节点是通过沿着路径或者 step 来选取的,也就是上面所说的按照子元素从上到下去找元素节点
这些是最有用的路径表达式 ?
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
路径表达式 | 结果 |
---|---|
urlset | 选取 urlset 元素的所有子节点 |
/urlset | 选取根元素 urlset |
urlset/url | 选取属于 urlset 的子元素的所有 url 元素 |
//url | 选取所有 url 子元素,而不管它们在文档中的位置 |
urlset//url | 选择属于 urlset 元素的后代的所有 url 元素,而不管它们位于 urlset 之下的什么位置 |
//@href | 选取名为 href 的所有属性 |
其他 XPath 语法请参考w3school
提取本站网站地图中 id 属性为 content 的的子元素 h3 的内容以及子元素 a 的 href 属性,F12 去看代码找这个属性
div 的 id 属性,下面的子元素 h3 的内容,直接利用 text 方法来获取元素的内容,然后输出
这里的子元素层级关系必须按顺序写好,不然会报错的
IndexError: list index out of range
这就说明你的 XPath 规则没写好,list 是一个空的,没有一个元素
XPath 是一个非常好用的解析方法,同时也是作为爬虫学习的基础
沈唁志|一个PHPer的成长之路!
原创文章采用CC BY-NC-SA 4.0协议进行许可,转载请注明:转载自:Python爬虫之XPath语法和lxml库的用法