BeautifulSoup get_text不会删除所有标记和JavaScript

pio*_*kuc 7 html python xml screen-scraping beautifulsoup

我正在尝试使用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))
Run Code Online (Sandbox Code Playgroud)

不幸的是,对于许多网页,例如: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']);
Run Code Online (Sandbox Code Playgroud)

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

任何帮助都感激不尽.

elg*_*lge 13

nltk clean_html()擅长这个!

假设你的已经保存在一个变量你的HTML html

html = urllib.urlopen(address).read()
Run Code Online (Sandbox Code Playgroud)

然后只是使用

import nltk
clean_text = nltk.clean_html(html)
Run Code Online (Sandbox Code Playgroud)

UPDATE

支持clean_htmlclean_url将被丢弃的NLTK的未来版本.请暂时使用BeautifulSoup ...非常不幸.

有关如何实现此目的的示例在此页面上:

BeatifulSoup4 get_text仍然有javascript

  • 看起来nltk将来不支持清理html:https://github.com/nltk/nltk/commit/39a303e5ddc4cdb1a0b00a3be426239b1c24c8bb (4认同)
  • 太糟糕了,支持正在被取消.这是nltk中非常有用的功能. (2认同)