我正在尝试解析 html 片段:
<body><h1>title</h1><img src=""></body>
我使用 lxml.html.fromstring
.它让我发疯,因为它一直在剥离 <body>
我的片段的标签:
> lxml.html.fromstring('<html><h1>a</h1></html>').tag
'html'
> lxml.html.fromstring('<div><h1>a</h1></div>').tag
'div'
> lxml.html.fromstring('<body><h1>a</h1></body>').tag
'h1'
我也试过 document_fromstring
, fragment_fromstring
, clean_html
与 page_structure=False
等等...没有任何效果。
我需要使用 lxml,因为我要将 html 片段传递给 PyQuery。
我只是希望 lxml 不会弄乱我的 html 片段。有可能吗?
最佳答案
.fragment_fromstring()
删除 <html>
标签也是如此;基本上,只要您不有 HTML 文档(带有 <html>
顶级元素和/或文档类型),.fromstring()
回到 .fragment_fromstring()
并且该方法同时删除了 <html>
和 <body>
标签,总是。
解决方法是告诉.fragment_fromstring()
给你一个<body>
父级标签:
>>> lxml.html.fragment_fromstring('<body><h1>a</h1></body>', create_parent='body')
<Element body at 0x10d06fbf0>
这不会保留原始 <body>
上的任何属性标签。
另一种解决方法是使用 .document_fromstring()
方法,它将您的文档包装在 <html>
中标签,然后您可以再次将其删除:
>>> lxml.html.document_fromstring('<body><h1>a</h1></body>')[0]
<Element body at 0x10d06fcb0>
这确实保留了 <body>
上的属性:
>>> lxml.html.document_fromstring('<body class="foo"><h1>a</h1></body>')[0].attrib
{'class': 'foo'}
使用 .document_fromstring()
你的第一个例子的功能给出:
>>> body = lxml.html.document_fromstring('<body><h1>title</h1><img src=""></body>')[0]
>>> lxml.html.tostring(body)
'<body><h1>title</h1><img src=""></body>'
如果你只想在没有没有 HTML 标签的情况下执行此操作,请执行 lxml.html.fromstring()
执行并测试完整文档:
htmltest = lxml.html._looks_like_full_html_bytes if isinstance(inputtext, str) else lxml.html._looks_like_full_html_unicode
if htmltest(inputtext):
tree = lxml.html.fromstring(inputtext)
else:
tree = lxml.html.document_fromstring(inputtext)[0]
关于python - 解析lxml中的html正文片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16498805/