【发布时间】:2011-09-01 16:11:38
【问题描述】:
我正在编写一个使用 lxml.html 来解析网页的脚本。我曾经做过一些 BeautifulSoup,但由于它的速度,我现在正在尝试使用 lxml。
我想知道库中最明智的方法是做相当于 Javascript 的 InnerHtml 的方法——即检索或设置标签的完整内容。
<body>
<h1>A title</h1>
<p>Some text</p>
</body>
InnerHtml 因此是:
<h1>A title</h1>
<p>Some text</p>
我可以使用 hacks(转换为字符串/正则表达式等)来做到这一点,但我假设有一种正确的方法可以使用由于不熟悉而丢失的库。感谢您的帮助。
编辑:感谢 pobk 如此快速有效地向我展示了这方面的方法。对于任何尝试相同的人,这就是我最终得到的结果:
from lxml import html
from cStringIO import StringIO
t = html.parse(StringIO(
"""<body>
<h1>A title</h1>
<p>Some text</p>
Untagged text
<p>
Unclosed p tag
</body>"""))
root = t.getroot()
body = root.body
print (element.text or '') + ''.join([html.tostring(child) for child in body.iterdescendants()])
请注意,lxml.html 解析器会修复未关闭的标签,因此请注意这是否有问题。
【问题讨论】:
-
您可以考虑在 html.tostring 中使用
encoding='unicode'以获得漂亮的 Unicode 字符串,而不是 Python 讨厌的可怕的字节汤。 -
这也不对;如果
element.text包含任何元字符,它们会按字面意思出现。您必须自己进行 HTML 转义。