beautifulsoup 4:分段错误(核心转储)

Posted

技术标签:

【中文标题】beautifulsoup 4:分段错误(核心转储)【英文标题】:beautifulsoup 4: Segmentation fault (core dumped) 【发布时间】:2012-10-30 16:21:40 【问题描述】:

我爬取了以下页面:

http://www.nasa.gov/topics/earth/features/plains-tornadoes-20120417.html

但是在调用 BeautifulSoup(page_html) 时出现分段错误(核心转储),其中 page_html 是请求库中的内容。这是 BeautifulSoup 的错误吗?有什么办法可以解决这个问题吗?甚至像 try...except 这样的方法也会帮助我运行我的代码。提前致谢。

代码如下:

import requests
from bs4 import BeautifulSoup

toy_url = 'http://www.nasa.gov/topics/earth/features/plains-tornadoes-20120417.html'
res = requests.get(toy_url,headers="USER-Agent":"Firefox/12.0")
page = res.content
soup = BeautifulSoup(page)

【问题讨论】:

请显示您使用的代码,以便可以复制(我无法使用 urllib2 和 BeautifulSoup 复制)。 @DavidRobinson 现在附加代码。感谢您的提问。 安装lxml。由于标签错误,py2.7 的默认 HTML 解析器不会解析此页面......顺便说一句,py3.2 工作正常。 (不能让它出现段错误) 奇怪的是,这段代码对我来说也很好用(没有段错误)。我在 Mac OS X 10.7.3 上使用 Python 2.7.1,最新版本为 bs4requests(刚刚安装)。 @JBernardo 我最初在 python2.7 中将 'lxml' 与 BeautifulSoup(page,'lxml') 一起使用,但它得到了片段。不幸的是,我现在不能使用 py3.2,因为它可能与我的代码的其他部分不兼容。 【参考方案1】:

此问题是由a bug in lxml 引起的,在lxml 2.3.5 中已修复。您可以升级 lxml,或将 Beautiful Soup 与 html5lib 或 HTMLParser 解析器一起使用。

【讨论】:

我遇到了类似的错误“分段错误:11”将 lxml 从 3.4.1-py27_0 升级到 3.4.3-py27_0 解决了这个问题。【参考方案2】:

绝对是一个错误。不应该以这种方式进行段错误。我可以重现(4.0.1):

>>> import bs4, urllib2
>>> url = "http://www.nasa.gov/topics/earth/features/plains-tornadoes-20120417.html"
>>> page = urllib2.urlopen(url).read()
>>> soup = bs4.BeautifulSoup(page)
Segmentation fault

经过一分为二后,它看起来是由 DOCTYPE 引起的:

>>> page[:page.find(">")+1]
'<!DOCTYPE "xmlns:xsl=\'http://www.w3.org/1999/XSL/Transform\'">'

一个粗略的 hack 允许 bs4 解析它:

>>> soup = bs4.BeautifulSoup(page[page.find(">")+1:])
>>> soup.find_all("a")[:3]
[<a href="/home/How_to_enable_javascript.html" target="_blank">› Learn How</a>, <a href="#maincontent">Follow this link to skip to the main content</a>, <a class="nasa_logo" href="/home/index.html"><span class="hide">NASA - National Aeronautics and Space Administration</span></a>]

了解更多的人可能能够看到真正发生的事情,但这可能会帮助您入门。

【讨论】:

这取决于 bs4 使用的解析器:HTMLParseError: bad end tag: u"&lt;/scr' + 'ipt&gt;", at line 138, column 93...lxml 和 Python3.2 默认的 html 解析器工作正常 感谢帝斯曼。但我需要一个更通用的解决方案。因为我的爬虫不仅针对 nasa.gov 网站。 我在从 Wikipedia MW API 解析 HTML 时遇到了同样的问题。这工作得很好,又快又脏。谢谢。

以上是关于beautifulsoup 4:分段错误(核心转储)的主要内容,如果未能解决你的问题,请参考以下文章

在 virtualenv 中使用 python3.5 导入火炬时出现分段错误(核心转储)

分段错误:核心转储

分段故障核心转储错误

识别导致分段错误(核心转储)的错误

在 C 中转储的分段故障核心

获取“分段错误核心转储”