from lxml import etree text = ''' <div> <ul> <li class="item-0"><a href="link1.html">first item</a></li> <li class="item-1"><a href="link2.html">second item</a></li> <li class="item-inactive"><a href="link3.html">third item</a></li> <li class="item-1"><a href="link4.html">fourth item</a></li> <li class="item-0"><a href="link5.html">fifth item</a> </ul> </div> ''' html = etree.HTML(text) result = etree.tostring(html) print(result.decode('utf-8'))
从文件导入 HTML
1 2 3 4 5
from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser()) result = etree.tostring(html) print(result.decode('utf-8'))
获取节点
获取所有节点
获取一个 HTML 中的所有节点,使用规则 //*:
1 2 3 4 5 6
from lxml import etree html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//*')
print(result)
我们得到了一个 由 Element 类型组成的列表。
获取所有指定标签
如果我们想获取所有 li 标签,我们可以把上例中的html.xpath() 中的规则改为 '//li':
1 2 3 4
from lxml import etree html = etree.parse('./test.html', etree.HTMLParser()) result = html.xpath('//li') print(result)
如果无法获取任何匹配结果,html.xpath 将会返回 []
获取子节点
选择 li 节点所有直接 a 子节点,使用规则 '//li/a':
1 2 3 4 5
from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser()) result = html.xpath('//li/a') print(result)
要获取其下所有子孙a节点可以这样://li//a
获取特定属性的节点
用 @ 符号进行属性过滤。 smt[…] 是有 … 限制的smt。
选中 href 是 link4.html 的 a 节点,规则是 '//a[@href="link4.html"]:
1 2 3 4 5
from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser()) result = html.xpath('//a[@href="link4.html"]') print(result)
获取父节点
如果我们想获取上例的父节点, 然后再获取其 class 属性:
1 2 3 4 5 6 7
from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser()) result = html.xpath('//a[@href="link4.html"]/../@class') # 也可以用“节点轴” '//a[@href="link4.html"]/parent::*/@class'
li 节点的 class 属性有两个值,上面这个方法会失效,我们可以使用 contains() 函数:
1 2 3 4 5 6 7
from lxml import etree text = ''' <li class="li li-first"><a href="link.html">first item</a></li> ''' html = e#tree.HTML(text) result = html.xpath('//li[contains(@class, "li")]/a/text()') print(result)
这里还可以使用运算符 and 来连接:
1 2 3 4 5 6 7
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)