我正在尝试从任意html页面中提取文本。有些页面(我无法控制)有错误的html或脚本,这使得这很困难。此外,我在一个共享的托管环境,所以我可以安装任何python库,但我不能只在服务器上安装我想要的东西。
pyparsing和html2text.py似乎也不适用于格式错误的html页面。
示例网址为http://apnews.myway.com/article/20091015/D9BB7CGG1.html
我目前的实施大致如下:
# Try using BeautifulSoup 3.0.7a
soup = BeautifulSoup.BeautifulSoup(s)
comments = soup.findAll(text=lambda text:isinstance(text,Comment))
[comment.extract() for comment in comments]
c=soup.findAll('script')
for i in c:
i.extract()
body = bsoup.body(text=True)
text = ''.join(body)
# if BeautifulSoup can't handle it,
# alter html by trying to find 1st instance of "<body" and replace everything prior to that, with "<html><head></head>"
# try beautifulsoup again with new html
如果beautifulsoup仍然不起作用,那么我采用一种启发式方法来查看第一个字符,最后一个字符(看看它们是否看起来像是一个代码行#&lt ;;并且取一行样本然后检查令牌是英文单词还是数字。如果令牌中只有很少的单词或数字,那么我猜这行是代码。
我可以使用机器学习来检查每一行,但这看起来有点贵,我可能需要训练它(因为我对无监督学习机器知之甚少),当然也可以写它。
任何建议,工具和策略都会受到欢迎。此外,我意识到后一部分相当混乱,因为如果我得到一行确定包含代码,我现在扔掉整行,即使行中有少量实际的英文文本。
答案 0 :(得分:5)
尽量不要笑,但是:
class TextFormatter:
def __init__(self,lynx='/usr/bin/lynx'):
self.lynx = lynx
def html2text(self, unicode_html_source):
"Expects unicode; returns unicode"
return Popen([self.lynx,
'-assume-charset=UTF-8',
'-display-charset=UTF-8',
'-dump',
'-stdin'],
stdin=PIPE,
stdout=PIPE).communicate(input=unicode_html_source.encode('utf-8'))[0].decode('utf-8')
我希望你有lynx!
答案 1 :(得分:0)
嗯,这取决于解决方案有多好。我遇到了类似的问题,将数百个旧的html页面导入新网站。我基本上做了
# remove all that crap around the body and let BS fix the tags
newhtml = "<html><body>%s</body></html>" % (
u''.join( unicode( tag ) for tag in BeautifulSoup( oldhtml ).body.contents ))
# use html2text to turn it into text
text = html2text( newhtml )
它已经解决了,但当然文件可能非常糟糕,甚至BS都无法挽救太多。
答案 2 :(得分:0)
BeautifulSoup会对格式错误的HTML造成不良影响。一些正则表达式怎么样?
>>> import re
>>>
>>> html = """<p>This is paragraph with a bunch of lines
... from a news story.</p>"""
>>>
>>> pattern = re.compile('(?<=p>).+(?=</p)', re.DOTALL)
>>> pattern.search(html).group()
'This is paragraph with a bunch of lines\nfrom a news story.'
然后,您可以汇编要从中提取信息的有效标记列表。