4

我爬取了以下页面:

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)
4

2 回答 2

6

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

于 2012-11-11T00:05:49.670 回答
1

绝对是一个错误。不应该以这种方式进行段错误。我可以重现(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>]

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

于 2012-11-10T16:00:20.483 回答