gpt4 book ai didi

lxml - 将lxml _Element转换为HtmlElement

转载 作者:行者123 更新时间:2023-12-03 16:28:32 27 4
gpt4 key购买 nike

由于各种原因,我试图从lxml.html.fromstring()切换到lxml.html.html5parser.document_fromstring()。两者之间的最大区别是,第一个返回lxml.html.HtmlElement,第二个返回lxml.etree._Element

通常这是可以的,但是当我尝试使用_Element对象运行代码时,它崩溃了,并说:

AttributeError: 'lxml.etree._Element' object has no attribute 'rewrite_links'

这是有道理的。我的问题是,解决此问题的最佳方法是什么。我有很多期望HtmlElements的代码,所以我认为最好的解决方案是将其转换为HtmlElements。我不确定这是否可能。

更新

一个可怕的解决方案是这样的:
from lxml.html import fromstring, tostring
from lxml.html import html5parser

e = html5parser.fromstring(text)
html_element = fromstring(tostring(e))

显然,这是蛮力的,但确实有效。我能够得到由html5parser解析的HtmlElement,这是我要的。

另一个选择是弄清楚如何执行我所依赖的rewrite_links和xpath查询,但是 _Element似乎没有该功能(再次有意义!)

最佳答案

一种解决方案,不占用CPU大量精力,而是通过基于roottree的方法创建几乎为空的HtmlElement并附加_Element子项。

from lxml.html import fromstring, tostring
from lxml.html import html5parser


text = "<html lang='en'><body><a href='http://localhost'>hello</body></html>"
e = html5parser.fromstring(text)

html_element = fromstring(tostring(e.getroottree()))
for child in e.getchildren():
html_element.append(child)

print(tostring(html_element))


def rewriter(link):
return "http://newlink.com"

html_element.rewrite_links(rewriter)
print(tostring(html_element.body))

将输出:
b'<html><body><html xmlns:html="http://www.w3.org/1999/xhtml" lang="en"><head></head><body><a href="http://localhost">hello</a></body></html></body><html:head xmlns:html="http://www.w3.org/1999/xhtml"></html:head><html:body xmlns:html="http://www.w3.org/1999/xhtml"><html:a href="http://localhost">hello</html:a></html:body></html>'
b'<body><html xmlns:html="http://www.w3.org/1999/xhtml" lang="en"><head></head><body><a href="http://newlink.com">hello</a></body></html></body>'

因此,在这种情况下,诸如“body”之类的属性和诸如“rewrite_links”之类的方法都可以工作。

关于lxml - 将lxml _Element转换为HtmlElement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33134590/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com