一尘不染

BeautifulSoup get_text不会剥离所有标签和JavaScript

python

我正在尝试使用BeautifulSoup从网页获取文本。

以下是我编写的脚本。它带有两个参数,第一个是输入HTML或XML文件,第二个是输出文件。

import sys
from bs4 import BeautifulSoup

def stripTags(s): return BeautifulSoup(s).get_text()

def stripTagsFromFile(inFile, outFile):
    open(outFile, 'w').write(stripTags(open(inFile).read()).encode("utf-8"))

def main(argv):
    if len(sys.argv) <> 3:
        print 'Usage:\t\t', sys.argv[0], 'input.html output.txt'
        return 1
    stripTagsFromFile(sys.argv[1], sys.argv[2])
    return 0

if __name__ == "__main__":
    sys.exit(main(sys.argv))

不幸的是,对于许多网页来说,例如:http : //www.greatjobsinteaching.co.uk/career/134112/Education-
Manager-
Location 我得到这样的信息(我只显示了几行):

html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
    Education Manager  Job In London With  Caleeda | Great Jobs In Teaching

var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-15255540-21']);
_gaq.push(['_trackPageview']);
_gaq.push(['_trackPageLoadTime']);

我的脚本有什么问题吗?我试图将“ xml”作为第二个参数传递给BeautifulSoup的构造函数以及“ html5lib”和“
lxml”,但这没有帮助。是否有BeautifulSoup的替代方法可以更好地完成此任务?我想要的只是提取要在浏览器中呈现的用于该网页的文本。

任何帮助都感激不尽。


阅读 224

收藏
2021-01-20

共1个答案

一尘不染

nltkclean_html()在这方面非常擅长!

假设您已经将html存储在html像这样的变量中

html = urllib.urlopen(address).read()

然后就用

import nltk
clean_text = nltk.clean_html(html)

更新

支持clean_htmlclean_url将被丢弃的NLTK的未来版本。请暂时使用BeautifulSoup …这很不幸。

2021-01-20