BeautifulSoup解析的问题

时间:2009-03-02 03:13:21

标签: python beautifulsoup

我正在尝试使用BeautifulSoup解析html页面,但看起来BeautifulSoup根本不喜欢html或那个页面。当我运行下面的代码时,方法prettify()只返回页面的脚本块(见下文)。有人知道它为什么会发生吗?

import urllib2
from BeautifulSoup import BeautifulSoup

url = "http://www.futureshop.ca/catalog/subclass.asp?catid=10607&mfr=&logon=&langid=FR&sort=0&page=1"
html = "".join(urllib2.urlopen(url).readlines())
print "-- HTML ------------------------------------------"
print html
print "-- BeautifulSoup ---------------------------------"
print BeautifulSoup(html).prettify()

这是BeautifulSoup产生的输出。

-- BeautifulSoup ---------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script language="JavaScript">
 <!--
     function highlight(img) {
       document[img].src = "/marketing/sony/images/en/" + img + "_on.gif";
     }

     function unhighlight(img) {
       document[img].src = "/marketing/sony/images/en/" + img + "_off.gif";
     }
//-->
</script>

谢谢!

更新:我使用的是以下版本,似乎是最新版本。

__author__ = "Leonard Richardson (leonardr@segfault.org)"
__version__ = "3.1.0.1"
__copyright__ = "Copyright (c) 2004-2009 Leonard Richardson"
__license__ = "New-style BSD"

7 个答案:

答案 0 :(得分:6)

尝试使用版本3.0.7a作为Łukasz建议。 BeautifulSoup 3.1被设计为与Python 3.0兼容,因此他们必须将解析器从SGMLParser更改为HTMLParser,这似乎更容易受到不良HTML的攻击。<​​/ p>

来自changelog for BeautifulSoup 3.1

“Beautiful Soup现在基于HTMLParser而不是SGMLParser,它在Python 3中消失了。有一些不好的HTML,SGMLParser处理但HTMLParser没有”

答案 1 :(得分:3)

试试lxml。尽管它的名字,它也用于解析和抓取HTML。它比BeautifulSoup快得多,它甚至比BeautifulSoup更好地处理“破坏”的HTML,所以它可能对你更好。如果您不想学习lxml API,它还有BeautifulSoup的兼容性API。

Ian Blicking agrees

没有理由再使用BeautifulSoup了,除非您使用的是Google App Engine或其他不允许使用Python的东西。

答案 2 :(得分:2)

BeautifulSoup并不神奇:如果传入的HTML太可怕,那么它就不会起作用了。

在这种情况下,传入的HTML就是这样:对于BeautifulSoup来说太过分了,无法确定要做什么。例如,它包含如下标记:

SCRIPT type =“”javascript“”

(请注意双引号。)

BeautifulSoup文档包含一个部分,如果BeautifulSoup无法解析您的标记,您可以执行此操作。您需要调查这些替代方案。

答案 3 :(得分:2)

Samj:如果我得到的话 HTMLParser.HTMLParseError: bad end tag: u"</scr' + 'ipt>" 我只是在将它送到BeautifulSoup之前从标记中删除了罪魁祸首,所有这些都是花花公子:

html = urllib2.urlopen(url).read()
html = html.replace("</scr' + 'ipt>","")
soup = BeautifulSoup(html)

答案 4 :(得分:1)

我在解析以下代码时也遇到了问题:

<script>
        function show_ads() {
          document.write("<div><sc"+"ript type='text/javascript'src='http://pagead2.googlesyndication.com/pagead/show_ads.js'></scr"+"ipt></div>");
        }
</script>

HTMLParseError:错误结束标记:u'',第26行,第127列

萨姆

答案 5 :(得分:0)

我在BeautifulSoup版本'3.0.7a'上测试了这个脚本,它返回了看似正确的输出。我不知道'3.0.7a'和'3.1.0.1'之间有什么变化,但试一试。

答案 6 :(得分:0)

import urllib
from BeautifulSoup import BeautifulSoup

>>> page = urllib.urlopen('http://www.futureshop.ca/catalog/subclass.asp?catid=10607&mfr=&logon=&langid=FR&sort=0&page=1')
>>> soup = BeautifulSoup(page)
>>> soup.prettify()

在我的情况下,通过执行上述语句,它将返回整个HTML页面。