我试图分析html page with BeautifulSoup,但它似乎BeautifulSoup不喜欢html或那一页。当我运行的代码下面的方法,该方法美化()返回我只脚本框页(见下文)。没有任何人拥有一个主意为什么会发生?

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"
有帮助吗?

解决方案

尝试用版本3.0.7一样 Łukasz 提出了建议。BeautifulSoup3.1的目的是要兼容Python3.0所以他们不得不改变分析器自SGMLParser到HTMLParser这似乎更容易受到不良HTML。

更为BeautifulSoup3.1:

"美丽的汤是现在基于HTMLParser而不是SGMLParser,这是走在Python3.还有一些坏HTML SGMLParser处理,但HTMLParser不"

其他提示

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

Ian Blicking同意

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

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

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

SCRIPT type = <!> quot; <!> quot; javascript <!> quot; <!> quot;

(请注意双引号。)

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

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

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

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

<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列

萨姆

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

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页面。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top