Python Xpath基础知识

一、Xpath简介

   XPath, 全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言。它最初是用来搜寻 XML 文档的,但是它同样适用于 HTML 文档的搜索。。

  XPath 于 1999 年 l l 月 16 日成为 W3C标准,它被设计为供 XSLT、 XPointer 以及其他 XML解析 软件使用,更多的文档可以访问其官方网站: https://www.w3.org/TR/xpath/。

二、Xpath常用规则

表达式 描述
nodename 选取此节点的所有子节点
/ 从当前节点选取直接子节点
// 从当前节点选取子孙节点
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性
* 所有节点

常用的模块

lxml库的etree模块

常用的方法

tostring():可输出修正后的HTML代码

decode():转换代码类型

三、节点选取例子

3.1 所有节点
from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
result = html.xpath('//*')
print(result)

一般会用//开头的Xpath规则来选取所有符号要求的节点。

3.2 子节点
from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
result = html.xpath('//li/a')
print(result)

我们通过/或//即可查找元素的子节点或子孙节点。假如现在想选择 li 节点的所有直接 a 子节点, 可以这样实现。

3.3 父节点
from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
result = html.xpath('//a@[href="link4.html"]/../@class')
print(result)

比如,现在首先选中 href 属性为 link4.html 的 a 节点,然后再获取其父节点,然后再获取其 class 属性。

3.4 属性匹配
from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
result = html.xpath('//li[@class="item-0"]')
print(result)

比如,这里如果要选取 class 为 item-1 的 li 节点。

3.5 文本获取
from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
result = html.xpath('//li[@class="item-0"]//text()')
print(result)

用 XPath 中的 text()方法获取节点中的文本。

3.6 属性获取

例如,我们想获取所有 li 节点下所有 a 节点的 href 属性,代码如下:

from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
result = html.xpath('//li/a/@href')
print(result)
3.7 属性多值匹配
from lxml import etree
text = '''
<li class = "li li-first"><a href="link.html">first item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class,"li")]/a/text()')
print(result)
3.8 多属性匹配
from lxml import etree
text = '''
<li class = "li li-first" name="item"><a href="link.html">first item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class,"li") and @name="item"]/a/text()')
print(result)
posted @ 2020-08-20 16:57  YuDi雨恋  阅读(253)  评论(0)    收藏  举报