用lxml解析html(标签h3)

发布于 2024-12-12 06:12:00 字数 1191 浏览 0 评论 0原文

我正在尝试解析一些 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

当我打印代码时,它会出现 [],我认为它应该是一个带有

的列表;其他

。 如果我有该列表,我将执行 etree.tostring(html_filtrado) 来查看

Other< /h3>

那么怎样才能得到这个代码呢?

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

或者只有 ../url ?这就是我想要的部分!

谢谢

I'm trying to parse some html and I have some problem with this little html code.

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>

code:

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

When I print the code it appears [], and I suppose that It should be a list with <h3 class="header"><a href="../url">Other</a></h3> in it.
If I would have that list I would execute etree.tostring(html_filtrado) to see <h3 class="header"><a href="../url">Other</a></h3>.

So how can get this code?

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

Or only ../url ? which is the part I want!!

Thank you

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

郁金香雨 2024-12-19 06:12:00

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

要获取 div 标签内所有 h3 标签的列表,您应该使用:

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

应该给出:

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

要获取所有 href 属性的列表h3 标签内的 a 标签,您可以使用如下内容

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

['../url']

The XPath query in your example is not quite right.

To get a list of all h3 tags within div tags, you should use this:

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

Which should give:

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

To get a list of all href attributes of a tags within h3 tags, you could use something like this:

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

Which gives:

['../url']
笑红尘 2024-12-19 06:12:00

情况是,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'

The case is, that etree.HTMLParser() when receives HTML, it creates the full html DOM tree.
So, instead of what you intended, if you use etree.tostring(tree) you get

<!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/>               

So, the correct xpath would be '/html/body/div/h3'

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文