出于各种原因,我试图从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
似乎没有该功能(再次有意义!)
一种比使用brut力少CPU强度的解决方案是创建一个几乎为空的HtmlElement并附加_Element(我循环了
from lxml.html import fromstring, tostring
from lxml.html import html5parser
text = "<html><body><a href='http://localhost'>hello</body></html>"
e = html5parser.fromstring(text)
html_element = fromstring('<html></html>')
for child in e.getchildren():
html_element.append(child)
def rewriter(link):
return "http://newlink.com"
html_element.rewrite_links(rewriter)
print(tostring(html_element.body))
将输出:
b'<html:body xmlns:html="http://www.w3.org/1999/xhtml"><html:a href="http://newlink.com">hello</html:a></html:body>'