BeatifulSoup4 get_text 仍然有 javascript

Posted

技术标签:

【中文标题】BeatifulSoup4 get_text 仍然有 javascript【英文标题】:BeatifulSoup4 get_text still has javascript 【发布时间】:2014-05-13 01:25:57 【问题描述】:

我正在尝试使用 bs4 删除所有 html/javascript,但是,它并没有摆脱 javascript。我仍然在文本中看到它。我该如何解决这个问题?

我尝试使用 nltk,它工作正常,但是,clean_htmlclean_url 将被删除。有没有办法使用汤get_text 并获得相同的结果?

我尝试查看这些其他页面:

BeautifulSoup get_text does not strip all tags and JavaScript

目前我正在使用 nltk 已弃用的功能。

编辑

这是一个例子:

import urllib
from bs4 import BeautifulSoup

url = "http://www.cnn.com"
html = urllib.urlopen(url).read()
soup = BeautifulSoup(html)
print soup.get_text()

我仍然看到 CNN 的以下内容:

$j(function() 
"use strict";
if ( window.hasOwnProperty('safaripushLib') && window.safaripushLib.checkEnv() ) 
var pushLib = window.safaripushLib,
current = pushLib.currentPermissions();
if (current === "default") 
pushLib.checkPermissions("helloClient", function() );


);

/*globals MainLocalObj*/
$j(window).load(function () 
'use strict';
MainLocalObj.init();
);

如何删除 js?

我发现的只有其他选项:

https://github.com/aaronsw/html2text

html2text 的问题在于它有时真的真的很慢,并且会产生明显的延迟,这是 nltk 一直非常擅长的一件事。

【问题讨论】:

如果我们能看到包含 javascript 的 html 的(一部分),那真的很有帮助 【参考方案1】:

部分基于Can I remove script tags with BeautifulSoup?

import urllib
from bs4 import BeautifulSoup

url = "http://www.cnn.com"
html = urllib.urlopen(url).read()
soup = BeautifulSoup(html)

# kill all script and style elements
for script in soup(["script", "style"]):
    script.decompose()    # rip it out

# get text
text = soup.get_text()

# break into lines and remove leading and trailing space on each
lines = (line.strip() for line in text.splitlines())
# break multi-headlines into a line each
chunks = (phrase.strip() for line in lines for phrase in line.split("  "))
# drop blank lines
text = '\n'.join(chunk for chunk in chunks if chunk)

print(text)

【讨论】:

而不是script.extract(),最好使用script.decompose(),它只删除而不返回标签对象。 你正在构建很多数据结构,这样你就不必写re.sub("[ \n\r\t]2,", " ", text) :) @badp 特别是你可以说soup.get_text(" ", strip=True) ? @CsabaToth, @badp,您实际上不想使用strip=True,因为它会导致字符串连接不正确。保存它们很重要,然后使用splitlines,然后清理每个单独的字符串。 @HughBothwell,仍然无法完全停止脚本标签。 here【参考方案2】:

为了防止最后出现编码错误...

import urllib
from bs4 import BeautifulSoup

url = url
html = urllib.urlopen(url).read()
soup = BeautifulSoup(html)

# kill all script and style elements
for script in soup(["script", "style"]):
    script.extract()    # rip it out

# get text
text = soup.get_text()

# break into lines and remove leading and trailing space on each
lines = (line.strip() for line in text.splitlines())
# break multi-headlines into a line each
chunks = (phrase.strip() for line in lines for phrase in line.split("  "))
# drop blank lines
text = '\n'.join(chunk for chunk in chunks if chunk)

print(text.encode('utf-8'))

【讨论】:

仍然无法完全停止脚本标签 例如。 here

以上是关于BeatifulSoup4 get_text 仍然有 javascript的主要内容,如果未能解决你的问题,请参考以下文章

如何对分支 python 版本有 100% 的覆盖率?

beautifulsoup .get_text() 对我的 HTML 解析不够具体

来自 find_all 的 BeautifulSoup get_text

Beautifulsoup - get_text,单行输出

BeautifulSoup get_text 不会去除所有标签和 JavaScript

美丽的汤,get_text 但不是 <span> 文本.. 我怎样才能得到它?