无法使用urllib2.urlopen获取的Guardian文章创建Soup

时间:2012-03-30 09:15:37

标签: beautifulsoup urllib2 python-2.7 urlopen

当我使用urllib2.urlopen()获取的Guardian文章时,无论如何我都无法创建一个汤。当相同的代码与另一个url一起使用时。 这是我的代码:

import urllib2
from bs4 import BeautifulSoup

url = 'http://www.guardian.co.uk/sport/2012/mar/29/jessica-ennis-london-2012'
myfile = urllib2.urlopen(url)
data = myfile.read()
soup = BeautifulSoup(data)

会触发以下错误:

  

Traceback(最近一次调用最后一次):文件   “/home/myhome/workspace/guardiangrep/testing.py”,第13行,in       soup = BeautifulSoup(data)File“/usr/lib/python2.7/site-packages/beautifulsoup4-4.0.2-py2.7.egg/bs4/init.py”,   第168行,在 init 中       self._feed()文件“/usr/lib/python2.7/site-packages/beautifulsoup4-4.0.2-py2.7.egg/bs4/init.py”,   第181行,在_feed中       self.builder.feed(self.markup)文件“/usr/lib/python2.7/site-packages/beautifulsoup4-4.0.2-py2.7.egg/bs4/builder/_htmlparser.py”,   第133行,在饲料中       parser.feed(标记)文件“/usr/lib/python2.7/HTMLParser.py”,第108行,在Feed中       self.goahead(0)文件“/usr/lib/python2.7/HTMLParser.py”,第148行,在goahead       k = self.parse_starttag(i)文件“/usr/lib/python2.7/HTMLParser.py”,第229行,在parse_starttag中       endpos = self.check_for_whole_start_tag(i)文件“/usr/lib/python2.7/HTMLParser.py”,第304行,   check_for_whole_start_tag       self.error(“格式错误的开始标记”)文件“/usr/lib/python2.7/HTMLParser.py”,第115行,出错       引发HTMLParseError(message,self.getpos())HTMLParser.HTMLParseError:格式错误的开始标记,在第3025行,列   16

我理解在这种情况下标题可能是有用的信息。如果我添加

headers = myfile.info()
print headers

我得到了

  

服务器:Apache X-GU-jas:05-1559 Vary:Accept-Encoding,User-Agent   X-GU-gen-jas:05内容类型:text / html; charset = UTF-8 P3P:CP =“CAO   CURA ADMa DEVa TAIa PSAa PSDa IVAa IVDa CONa TELa OUR IND ONLi UNI   PURi NAV STA PRE LOC“日期:星期五,2012年3月30日09:10:54 GMT   X-GU-PageRenderer:DefaultPageRenderer Keep-Alive:timeout = 5,max = 70   Transfer-Encoding:chunked X-GU-tm:01 Content-Language:en-US   连接:关闭X-GU-httpd:05

非常感谢任何帮助。

编辑: 恢复到BeautifulSoup 3似乎纠正了这个问题。令人费解!

1 个答案:

答案 0 :(得分:1)

我通过Leonard Richardson的其他渠道收到了以下答案。它解决了我的问题

你正在使用Python的内置解析器类HTMLParser,它不像Beautiful Soup 3使用的内置SGMLParser那么宽松。

从Python 2.7.3和Python 3.2.2开始,内置的HTMLParser变得更加宽松,但最简单的解决方案是安装外部解析库。 lxml或html5lib应该能够解析这个文档。

这在此解释:

http://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser