使用lxml解析html(标记h3)

时间:2011-10-26 22:45:07

标签: python html parsing xpath lxml

我正在尝试解析一些HTML,我对这个小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 个答案:

答案 0 :(得分:4)

您的示例中的XPath查询不太正确。

要获取h3代码中所有div代码的列表,您应该使用此代码:

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

应该给出:

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

要获取href代码中a代码的所有h3属性的列表,您可以使用以下内容:

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

给出了:

['../url']

答案 1 :(得分: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'