用lxml解析html(h3标签)
我正在尝试解析一些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'