我想用Python从HTML文件中提取文本。我想要的输出基本上与从浏览器复制文本并将其粘贴到记事本中得到的输出相同。
我想要一些比使用正则表达式更健壮的东西,因为正则表达式在格式不佳的HTML上可能会失败。我看到很多人推荐Beautiful Soup,但我在使用它时遇到了一些问题。首先,它会拾取不需要的文本,比如JavaScript源。而且,它不能解释HTML实体。例如,我希望‘in HTML source’转换为文本中的撇号,就像我将浏览器内容粘贴到记事本中一样。
更新
看起来很有希望。它正确地处理HTML实体并忽略JavaScript。但是,它并不能准确地生成纯文本;它会生成必须转换为纯文本的markdown。它没有提供示例或文档,但代码看起来很干净。
相关问题:
过滤掉HTML标签并解析python中的实体
在Python中将XML/HTML实体转换为Unicode字符串
发布于 2008-11-30 03:23:59
html2text
是一个Python程序,在这方面做得很好。
发布于 2011-11-20 20:34:10
注意:
NTLK不再支持
函数
下面是原始答案,评论部分提供了替代方案。
使用
NLTK
我浪费了4-5个小时来解决html2text的问题。幸运的是,我可以遇到NLTK。
它神奇地工作着。
import nltk
from urllib import urlopen
url = "http://news.bbc.co.uk/2/hi/health/2284783.stm"
html = urlopen(url).read()
raw = nltk.clean_html(html)
print(raw)
发布于 2010-10-21 21:14:39
我发现自己今天也面临着同样的问题。我编写了一个非常简单的HTML解析器来剥离传入内容的所有标记,只返回仅包含最少格式的剩余文本。
from HTMLParser import HTMLParser
from re import sub
from sys import stderr
from traceback import print_exc
class _DeHTMLParser(HTMLParser):
def __init__(self):
HTMLParser.__init__(self)
self.__text = []
def handle_data(self, data):
text = data.strip()
if len(text) > 0:
text = sub('[ \t\r\n]+', ' ', text)
self.__text.append(text + ' ')
def handle_starttag(self, tag, attrs):
if tag == 'p':
self.__text.append('\n\n')
elif tag == 'br':
self.__text.append('\n')
def handle_startendtag(self, tag, attrs):
if tag == 'br':
self.__text.append('\n\n')
def text(self):
return ''.join(self.__text).strip()
def dehtml(text):
try:
parser = _DeHTMLParser()
parser.feed(text)
parser.close()
return parser.text()
except:
print_exc(file=stderr)
return text
def main():
text = r'''
Project: DeHTML
Description:
This small script is intended to allow conversion from HTML markup to
plain text.
'''
print(dehtml(text))
if __name__ == '__main__':
main()
https://stackoverflow.com/questions/328356
复制相似问题