2015-07-05 36 views
3

我正在网络报废,我想从任何网站的文本,所以我使用Beautiful Soup。最初我发现get_text()方法也返回JavaScript代码,所以为了避免我碰到,我应该使用extract()方法,但现在我有一个奇怪的问题,提取scriptstyle标记Beautiful Soup不承认其身体即使其目前在新`HTML。美丽的汤不能get_text使用后提取()

让我清楚你的第一个我这样做

soup = BeautifulSoup(HTMLRawData, 'html.parser') 
print(soup.body) 

这里print声明打印所有html数据 但是当我做

soup = BeautifulSoup(rawData, 'html.parser') 
    for script in soup(["script", "style"]): 
     script.extract() # rip it out 
    print(soup.body) 

现在它正在打印None为元素不存在但为了调试后,我做了soup.prettify()然后它打印整个html包括body标签,也没有scriptstyle标签:(现在我很困惑的是,为什么它的发生,如果body存在比其为什么说None请帮助谢谢

,我使用Python 3和BS4和rawData是从网站上提取的HTML。

回答

3

问题:使用这个网站例如:

<html> 
<style>just style</style> 
<span>Main text.</span> 
</html> 

提取风格标签,并呼吁get_text()只返回它应该删除文本后。这是由于使用extract()后html中的双换行符。在.extract()之前和之后调用soup.contents,您将看到此问题。

之前提取物()

[<html>\n<style>just style</style>\n<span>Main text.</span>\n</html>] 

提取物()

[<html>\n\n<span>Main text.</span>\n</html>] 

你可以看到html和跨度之间的双新行。此问题由于某些未知原因而使get_text()刹车。为了验证这一点,删除示例中的换行符,它将正常工作。

解决方案:

1 .-解析汤提取物()调用后再次。

BeautifulSoup(str(soup), 'html.parser') 

2:使用不同的解析器。

BeautifulSoup(raw, 'html5lib') 

注:如果你提取两个或多个连续的标签,因为你再次结束了双新行解决方案#2不工作。

注意:您可能需要安装此解析器。只要这样做:

pip install html5lib 
+0

你迟到了,但这个axact解决方案谢谢你:) – maq

+1

昨天刚刚有这个问题,并在这里寻找答案 –

0

你能否包含rawData的内容? 如果您RAWDATA是一样的东西:

<script>...</script> 
<script>...</script> 
<style>...</style> 

这是有道理的。 X.extract()将从DOM树中移除该标记。

没有整个内容和整个代码,它将很难提供帮助。

+0

我不是@maq,但我看到完全相同的行为。什么是rawData?似乎不是'BeautifulSoup'的方法,并且不会出现在'dir(汤)'中。 –

+0

实际上,它不会显示'dir',但它是一个属性。对我来说,'rawData'是'None'。但get_text()仍然显示输出废话,这是在我提取的脚本标记中。 –

+0

对不起@mike晚期bt请chk更新问题 – maq

0

这似乎是在最新的4.4.0版本中的错误。我有一个几乎相同的问题:分解(或提取)标签后:我无法访问下一个标签。

Miguel Sanchez的第一个答案有效,但速度很慢!

回滚到BeautifulSoup 4.3.2为我解决了问题。

pip uninstall beautifulsoup4 
pip install -Iv http://www.crummy.com/software/BeautifulSoup/bs4/download/4.3/beautifulsoup4-4.3.2.tar.gz