Python [lxml] - 清理HTML标签
from lxml.html.clean import clean_html, Cleaner
def clean(text):
try:
cleaner = Cleaner(scripts=True, embedded=True, meta=True, page_structure=True, links=True, style=True,
remove_tags = ['a', 'li', 'td'])
print (len(cleaner.clean_html(text))- len(text))
return cleaner.clean_html(text)
except:
print 'Error in clean_html'
print sys.exc_info()
return text
我写了上面的(看起来很糟糕的)代码,这是我刚开始接触Python时的尝试。我想用lxml cleaner来清理几个HTML页面,最终只想留下文本,其他的都不要。但是无论我怎么尝试,上面的代码似乎都没有效果,我仍然看到很多标记(而且看起来并不是损坏的HTML),特别是链接,这些链接没有被删除,尽管我在remove_tags
和links=True
中使用了相关的参数。
你知道发生了什么吗?也许我在lxml上走错了方向?我以为这是在Python中解析HTML的正确方法呢?
3 个回答
5
我觉得你应该看看 Beautiful Soup 这个工具。可以参考 这篇文章 的建议,按照下面的方式去除HTML元素:
from BeautifulSoup import BeautifulSoup
''.join(BeautifulSoup(page).findAll(text=True))
这里的 page
是你的HTML字符串。
如果你需要更多的解释,可以查看 Dive into Python 上关于 HTML解析 的案例研究。
13
我不确定在你提问的时候这个方法是否已经存在,不过如果你试试下面的代码:
document = lxml.html.document_fromstring(html_text)
raw_text = document.text_content()
这样应该能给你返回整个html文档里的所有文本内容,去掉所有的格式标记。
15
来自 David 的解决方案是把文本连接在一起,没有任何分隔符:
import lxml.html
document = lxml.html.document_fromstring(html_string)
# internally does: etree.XPath("string()")(document)
print document.text_content()
但这个方法对我有帮助 - 是我需要的那种连接方式:
from lxml import etree
print "\n".join(etree.XPath("//text()")(document))