当前位置: 首页 > 面试题库 >

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

白芷阳
2023-03-14
问题内容

我正在尝试使用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的替代方法可以更好地完成此任务?我想要的只是提取要在浏览器中呈现的用于该网页的文本。

任何帮助都感激不尽。


问题答案:

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

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

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

然后就用

import nltk
clean_text = nltk.clean_html(html)

更新

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

此页面上提供了有关如何实现此目的的示例:

BeatifulSoup4
get_text仍然具有JavaScript



 类似资料:
  • 问题内容: 假设我有一个这样的html片段: 我想从中提取的是: 所以我的问题是:如何从html中剥离所有包装标签,并仅以与html中相同的顺序获取文本?正如您在标题中看到的那样,我想使用jsoup进行解析。 重音html的示例(注意’á’字符): 我想要的是: 这个html并不是静态的,通常我只希望通用html片段的每个文本都以已解码的人类可读形式显示,宽度换行。 问题答案: 使用Jsoup:

  • 问题内容: 我有以下html: 我要删除从开始到结束为止的所有内容。我怎么做? 问题答案: 使用本机DOM

  • 问题内容: 是否存在现有的Java库,该库提供了一种从字符串中剥离所有HTML标记的方法?我正在寻找与PHP中的功能等效的东西。 我知道我可以使用这个问题中描述的正则表达式,但是我很好奇,是否可能已经有一种方法可以在Apache Commons库中的某个地方使用。 问题答案: 在开放了将近一个星期的问题之后,我可以肯定地说,Java API或Apache库中没有可用的方法可从字符串中剥离HTML标

  • 问题内容: 我需要用ajax调用产生的html替换页面中div的内容。问题是html中包含一些必要的脚本,并且jquery html()函数似乎将它们剥离了,我需要过滤响应并仅获取特定的div。 我正在考虑一种解决方法,该方法是从ajax响应中提取所有脚本标签,然后将其附加到DOM中,但是这样做很麻烦。 这是我的代码; 但这是任何结论。我尝试了那里提出的解决方案,但没有一个起作用。 编辑:我似乎找

  • 问题内容: 我如何脱衣 我知道您可以使用剥离标签删除标签,但是我也希望两者之间的所有内容都消失了。 任何帮助,将不胜感激。 问题答案: 在处理HTML时,应使用HTML解析器正确处理它。您可以使用PHP的DOMDocument并使用DOMXPath查询元素,例如:

  • 问题内容: 我已经看到很多表达式可以删除一个特定的标签(或许多指定的标签),一个可以删除除一个特定标签之外的所有标签,但是我没有找到一种方法来删除其中除许多除外(即所有除外)之外的所有标签。 PHP。我对正则表达式不是很满意,所以我需要帮助。:) 谢谢! 问题答案: 确实做到这一点。