我正在尝试解析一些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
?这是我想要的部分!!
谢谢
答案 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'