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で試してください。BeautifulSoup3.1はPython3.0と互換性があるように設計されているため、パーサーをSGMLParserからHTMLParserに変更する必要がありました。

BeautifulSoup 3.1の変更ログから:

「BeautifulSoupは、Python 3で廃止されたSGMLParserではなくHTMLParserに基づいています。SGMLParserが処理した悪いHTMLがいくつかありますが、HTMLParserは処理しません。」

于 2009-03-02T09:16:27.327 に答える
3

lxmlを試してください。その名前にもかかわらず、HTML の解析とスクレイピングにも使用されます。BeautifulSoup よりはるかに高速で、「壊れた」HTML の処理も BeautifulSoup よりも優れているため、うまく機能する可能性があります。lxml API を学習したくない場合は、BeautifulSoup 用の互換 API もあります。

Ian Blicking も同意見です。

Google App Engine を使用している場合や、純粋な Python 以外が許可されていない場合を除き、BeautifulSoup を使用する理由はもうありません。

于 2009-08-03T15:39:32.367 に答える
2

BeautifulSoup は魔法ではありません。受け取った HTML がひどすぎると、うまくいきません。

この場合、入力される HTML はまさにそれです。BeautifulSoup が何をすべきかを理解するには壊れすぎています。たとえば、次のようなマークアップが含まれています。

SCRIPT type=""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 に答える