5

我正在尝试使用 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"
4

7 回答 7

6

按照Łukasz的建议尝试使用 3.0.7a 版本。BeautifulSoup 3.1 被设计为与 Python 3.0 兼容,因此他们不得不将解析器从 SGMLParser 更改为 HTMLParser,这似乎更容易受到不良 HTML 的影响。

BeautifulSoup 3.1 的更新日志中

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

于 2009-03-02T09:16:27.327 回答
3

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

Ian Blicking 同意

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

于 2009-08-03T15:39:32.367 回答
2

BeautifulSoup 并不神奇:如果传入的 HTML 太糟糕,那么它就无法工作。

在这种情况下,传入的 HTML 就是这样:BeautifulSoup 无法弄清楚该怎么做。例如,它包含如下标记:

脚本类型=""javascript""

(注意双引号。)

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

于 2009-03-02T04:09:28.237 回答
2

Samj:如果我得到这样的东西, HTMLParser.HTMLParseError: bad end tag: u"</scr' + 'ipt>" 我只是在将它提供给 BeautifulSoup 之前从标记中删除罪魁祸首,一切都是花花公子:

html = urllib2.urlopen(url).read()
html = html.replace("</scr' + 'ipt>","")
soup = BeautifulSoup(html)
于 2010-07-13T20:00:35.593 回答
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 列

山姆

于 2009-04-20T11:39:53.187 回答
0

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

于 2009-03-02T08:31:44.003 回答
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 页面。

于 2009-03-06T07:31:58.903 回答