Python 如何在不返回div标记的情况下使用Cleaner lxml.html?

Python 如何在不返回div标记的情况下使用Cleaner lxml.html?,python,lxml.html,Python,Lxml.html,我有以下代码: evil = "<script>malignus script</script><b>bold text</b><i>italic text</i>" cleaner = Cleaner(remove_unknown_tags=False, allow_tags=['p', 'br', 'b'], page_structure=True) print cleaner.cle

我有以下代码:

evil = "<script>malignus script</script><b>bold text</b><i>italic text</i>"
cleaner = Cleaner(remove_unknown_tags=False, allow_tags=['p', 'br', 'b'],
                  page_structure=True)
print cleaner.clean_html(evil)
evil=“恶意脚本粗体文本斜体文本”
cleaner=cleaner(删除未知的标签=False,允许标签=['p','br','b'],
页面(结构=真)
打印清洁剂。清洁html(邪恶)
我希望得到这个:

<b>bold text</b>italic text
粗体文本斜体文本
但我得到的是:

<div><b>bold text</b>italic text</div>
粗体文本斜体文本

是否有一个属性可以删除
div
标记包装器?

lxml希望您的html具有树结构,即单个根节点。如果没有,则添加它。

Cleaner总是将结果包装到元素中。一个好的解决方案是手动解析HTML并将生成的文档对象发送给cleaner,然后结果也是一个文档对象,您可以使用文本内容从根中提取文本

from lxml.html import document_fromstring
from lxml.html.clean import Cleaner
evil = "<script>malignus script</script><b>bold text</b><i>italic 
text</i>"
doc = document_fromstring(evil)
cleaner = Cleaner(remove_unknown_tags=False, allow_tags=['p', 'br', 'b'],
              page_structure=True)
print cleaner.clean_html(doc).text_content()
从lxml.html导入文档\u fromstring
从lxml.html.clean导入清理器
邪恶=“malignus scriptbold textitalic
“文本”
doc=文档\u fromstring(邪恶)
cleaner=cleaner(删除未知的标签=False,允许标签=['p','br','b'],
页面(结构=真)
打印清理器.clean_html(doc.text_content())

这也可以作为一个

来完成,下面是我的想法

导入lxml
从lxml.html.clean导入清理器
def clean_html(html):
如果是html:
is_wrap_in_div=检查is_wrap_in_div(html)
清洁剂=清洁剂()
html=更干净。干净\u html(html)
如果不是,则在分区中进行包装:
html=删除\u根\u div(html)
返回html
def check_是_wrap_in_div(html):
is_wrapped=False
尝试:
tree=lxml.etree.fromstring(html)
如果tree.tag==“div”:
返回真值
除lxml.etree.XMLSyntaxError外:
通过
退货包装好了
def remove_root_div(html):
root\u div\u regex=r'^(\s*)([\s\s]*)([\s\s]*?)$'
return re.sub(root\u div\u regex,r'\2',html)
#把它当作
cleaned_html=clean_html(邪恶的_html)
和单元测试

类TestBase(unittest.TestCase): def test_check_是_wrap_in_div(自我): 使用self.subTest('test html wrap in div'): 自我评价真实( utils.检查是否在分区(“”)中进行包装, ) 自我评价真实( utils.check在div中是否为wrap(“”) 你好

试验

""") ) 自我评价真实( utils.check在div中是否为wrap(“”) 你好

试验

""") ) 自我评价真实( utils.check在div中是否为wrap(“”) 你好

试验

""") ) 自我评价真实( utils.check在div中是否为wrap(“”) 你好

试验

""") ) 自我评价真实( utils.check在div中是否为wrap(“”) 你好

试验

""") ) 自我评价真实( utils.check在div中是否为wrap(“”) 你好

试验

""") ) 使用self.subTest('test html not wrap in div'): html_列表=[ """ 你好

""", """ 你好

试验

""", """ 你好

""", “你好

测试

”, """ 你好

""", """ 你好

""", """ 你好

""", """ 你好

世界

你好 """, """ 你好

世界

你好

世界

""", """ 你好

世界

你好

世界

""", """ 你好

世界

你好

世界

""",