用lxml解析html(h3标签)

1 投票
2 回答
2537 浏览
提问于 2025-04-17 05:04

我正在尝试解析一些HTML代码,但遇到了一些问题。

XML:

<div>
    <p><span><a href="../url"></a></span></p>
    <h3 class="header"><a href="../url">Other</a></h3>
    <a href="../url">Other</a><br>
    <a class="aaaaa" href="../url">Indice</a>
    <p></p>               
</div>

代码:

import urllib
from lxml import etree
import StringIO
resultado=urllib.urlopen('trozo.html')
html = resultado.read()
parser= etree.HTMLParser()
tree=etree.parse(StringIO.StringIO(html),parser)
xpath='/div/h3'
html_filtrado=tree.xpath(xpath)
print html_filtrado

当我打印代码时,它显示的是[],我想这应该是一个包含 <h3 class="header"><a href="../url">Other</a></h3> 的列表。如果我有了这个列表,我就可以用etree.tostring(html_filtrado)来查看 <h3 class="header"><a href="../url">Other</a></h3>

那么我该如何获取这段代码呢?

<h3 class="header"><a href="../url">Other</a></h3>

或者只获取 ../url 呢?这是我想要的部分!!

谢谢

2 个回答

4

你提供的XPath查询有点问题。

如果你想要获取所有在div标签里的h3标签,可以使用下面这个:

elements = tree.xpath('//div/h3')
etree.tostring(elements[0])

这样就能得到:

'<h3 class="header"><a href="../url">Other</a></h3>\n'

如果你想要获取所有在h3标签里的a标签的href属性,可以用类似这样的写法:

tree.xpath('//h3/a/@href')

这样就能得到:

['../url']
3

情况是这样的,当你使用 etree.HTMLParser() 处理 HTML 内容时,它会创建一个完整的 HTML DOM 树。

所以,如果你用 etree.tostring(tree) 而不是你想要的结果,你会得到

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><div>
<p><span><a href="../url"/></span></p>
<h3 class="header"><a href="../url">Other</a></h3>
<a href="../url">Other</a><br/><a class="aaaaa" href="../url">Indice</a>
<p/>               

因此,正确的 xpath 路径应该是 '/html/body/div/h3'

撰写回答