Beautiful Soup 在使用 extract() 后无法 get_text
Beautiful Soup Not able to get_text after using extract()
我正在从事网络抓取工作,我只需要来自任何网站的文本,所以我正在使用 Beautiful Soup
。最初我发现 get_text()
方法也返回 JavaScript
代码,所以为了避免我遇到我应该使用 extract()
方法但现在我有一个奇怪的问题,在提取 script
和 style
标签 Beautiful Soup
无法识别它的主体,即使它出现在新的 `html.
中
让我先澄清一下我在做这个
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
存在而不是为什么它说 None
请帮忙谢谢
并且我正在使用 Python 3 和 bs4,并且 rawData
是 html 从网站中提取的。
你能包括rawData的内容吗?
如果您的原始数据类似于:
<script>...</script>
<script>...</script>
<style>...</style>
有道理。 X.extract()
将从 DOM 树中删除该标签。
如果没有完整的内容和完整的代码,将很难提供帮助。
问题: 使用这个 html 例子:
<html>
<style>just style</style>
<span>Main text.</span>
</html>
在提取 style 标签并调用 get_text() 之后,returns 只有它应该删除的文本。这是由于使用 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 和 span 之间的双换行符。由于某些未知原因,此问题会中断 get_text()。要验证这一点,请删除示例中的换行符,它将正常工作。
解法:
1.- 在 extract() 调用后再次解析汤。
BeautifulSoup(str(soup), 'html.parser')
2.- 使用不同的解析器。
BeautifulSoup(raw, 'html5lib')
注意:如果您提取两个或多个连续标签,解决方案 #2 将不起作用,因为您最终会再次使用双换行符。
注意:您可能必须安装此解析器。只是做:
pip install html5lib
这似乎是最新的 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
我正在从事网络抓取工作,我只需要来自任何网站的文本,所以我正在使用 Beautiful Soup
。最初我发现 get_text()
方法也返回 JavaScript
代码,所以为了避免我遇到我应该使用 extract()
方法但现在我有一个奇怪的问题,在提取 script
和 style
标签 Beautiful Soup
无法识别它的主体,即使它出现在新的 `html.
让我先澄清一下我在做这个
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
存在而不是为什么它说 None
请帮忙谢谢
并且我正在使用 Python 3 和 bs4,并且 rawData
是 html 从网站中提取的。
你能包括rawData的内容吗? 如果您的原始数据类似于:
<script>...</script>
<script>...</script>
<style>...</style>
有道理。 X.extract()
将从 DOM 树中删除该标签。
如果没有完整的内容和完整的代码,将很难提供帮助。
问题: 使用这个 html 例子:
<html>
<style>just style</style>
<span>Main text.</span>
</html>
在提取 style 标签并调用 get_text() 之后,returns 只有它应该删除的文本。这是由于使用 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 和 span 之间的双换行符。由于某些未知原因,此问题会中断 get_text()。要验证这一点,请删除示例中的换行符,它将正常工作。
解法:
1.- 在 extract() 调用后再次解析汤。
BeautifulSoup(str(soup), 'html.parser')
2.- 使用不同的解析器。
BeautifulSoup(raw, 'html5lib')
注意:如果您提取两个或多个连续标签,解决方案 #2 将不起作用,因为您最终会再次使用双换行符。
注意:您可能必须安装此解析器。只是做:
pip install html5lib
这似乎是最新的 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