如何解决当使用lxml.html解析HTML时,等效于InnerHTML
|| 我正在使用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>
我可以使用黑客(转换为字符串/正则表达式等)来完成此操作,但我假设有一种正确的方法可以使用由于不熟悉而丢失的库来执行此操作。谢谢你的帮助。
编辑:感谢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解析器将修复未关闭的标记,因此请注意是否存在问题。
解决方法
您可以使用根节点的getchildren()或iterdescendants()方法获取ElementTree节点的子节点:
>>> from lxml import etree
>>> from cStringIO import StringIO
>>> t = etree.parse(StringIO(\"\"\"<body>
... <h1>A title</h1>
... <p>Some text</p>
... </body>\"\"\"))
>>> root = t.getroot()
>>> for child in root.iterdescendants(),:
... print etree.tostring(child)
...
<h1>A title</h1>
<p>Some text</p>
可以简写如下:
print \'\'.join([etree.tostring(child) for child in root.iterdescendants()])
,很抱歉再次提出此问题,但我一直在寻找解决方案,而您的解决方案包含一个错误:
<body>This text is ignored
<h1>Title</h1><p>Some text</p></body>
根元素正下方的文本将被忽略。我最终这样做:
(body.text or \'\') +\\
\'\'.join([html.tostring(child) for child in body.iterchildren()])
,import lxml.etree as ET
body = t.xpath(\"//body\");
for tag in body:
h = html.fromstring( ET.tostring(tag[0]) ).xpath(\"//h1\");
p = html.fromstring( ET.tostring(tag[1]) ).xpath(\"//p\");
htext = h[0].text_content();
ptext = h[0].text_content();
您还可以将.get(\'href\')
用作标记,将.attrib
用作属性,
这里的标签号是硬编码的,但您也可以动态地进行
,这是Python 3版本:
from xml.sax import saxutils
from lxml import html
def inner_html(tree):
\"\"\" Return inner HTML of lxml element \"\"\"
return (saxutils.escape(tree.text) if tree.text else \'\') + \\
\'\'.join([html.tostring(child,encoding=str) for child in tree.iterchildren()])
请注意,这包括按Andreymal的建议对初始文本进行转义-如果您使用的是经过处理的HTML,则需要这样做以避免标记注入!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。