我正在尝试使用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"
答案 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。
没有理由再使用BeautifulSoup了,除非您使用的是Google App Engine或其他不允许使用Python的东西。
答案 2 :(得分:2)
BeautifulSoup并不神奇:如果传入的HTML太可怕,那么它就不会起作用了。
在这种情况下,传入的HTML就是这样:对于BeautifulSoup来说太过分了,无法确定要做什么。例如,它包含如下标记:
SCRIPT type =“”javascript“”
(请注意双引号。)
BeautifulSoup文档包含一个部分,如果BeautifulSoup无法解析您的标记,您可以执行此操作。您需要调查这些替代方案。
答案 3 :(得分:2)
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页面。