我正在处理网络报废,我只想要来自任何网站的文字,所以我使用的是Beautiful Soup
。最初我发现get_text()
方法也返回JavaScript
代码,以避免我遇到我应该使用extract()
方法,但现在我有一个奇怪的问题,提取{{1}后} script
标记style
无法识别它的正文,即使它出现在新的`html中。
首先让我告诉你我正在做这件事
Beautiful Soup
此处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
和script
标记:(现在我非常困惑,为什么会发生这种情况,如果style
存在,那么为什么它body
请说帮助谢谢
我正在使用Python 3和bs4,None
是从网站上提取的html。
答案 0 :(得分:4)
问题:使用此html示例:
<html>
<style>just style</style>
<span>Main text.</span>
</html>
在提取 style 标记并调用get_text()之后,它只返回它应该删除的文本。这是由于使用extract()后html中的双重换行符。在.extract()之前和之后调用soup.contents,你会看到这个问题。
在 extract()之前:
[<html>\n<style>just style</style>\n<span>Main text.</span>\n</html>]
extract()之后:
[<html>\n\n<span>Main text.</span>\n</html>]
你可以看到html和span之间的双重换行符。这个问题由于某种未知原因而制动了get_text()。要验证此点,请删除示例中的换行符,它将正常工作。
<强>解决方案:强>
1 .- 在提取()调用后再次解析汤。
BeautifulSoup(str(soup), 'html.parser')
2 .- 使用其他解析器。
BeautifulSoup(raw, 'html5lib')
注意:如果您提取两个或多个连续标记,解决方案#2不起作用,因为您最终会再次使用双换行符。
注意:您可能需要安装此解析器。只是做:
pip install html5lib
答案 1 :(得分:0)
你能包含rawData的内容吗? 如果您的rawData类似于:
<script>...</script>
<script>...</script>
<style>...</style>
这很有道理。 X.extract()
将从DOM树中删除该标记。
如果没有整个内容和整个代码,将很难提供帮助。
答案 2 :(得分: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