4

私はBeautifulSoupでいくつかの危険なHTMLを解析するのに苦労していました。新しいバージョンで使用されているHTMLParserは、以前に使用されていたSGMLParserよりも耐性が低いことがわかりました。


BeautifulSoupにはある種のデバッグモードがありますか?ぼろぼろのWebサイトからロードしている厄介なHTMLで、それが中断するのを防ぐ方法を見つけようとしています。

<HTML>
    <HEAD>
        <TITLE>Title</TITLE>
        <HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
    </HEAD>
    <BODY>
        ...
        ...
    </BODY>
</HTML>

BeautifulSoupは<HTTP-EQUIV...>タグの後であきらめます

In [1]: print BeautifulSoup(c).prettify()
<html>
 <head>
  <title>
   Title
  </title>
 </head>
</html>

問題は明らかにHTTP-EQUIVタグであり、これは実際には非常に不正な形式の<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">タグです。明らかに、これを自己閉鎖として指定する必要がありますが、何を指定しても修正できません。

In [2]: print BeautifulSoup(c,selfClosingTags=['http-equiv',
                            'http-equiv="pragma"']).prettify()
<html>
 <head>
  <title>
   Title
  </title>
 </head>
</html>

BeautifulSoupが何をしているのかを教えてくれる詳細なデバッグモードはありますか?この場合、タグ名として何を扱っているのかを理解できますか?

4

3 に答える 3

6

Beautiful Soup 3.1.0 に問題がありますか? 回避策の 1 つとしてhtml5libのパーサーを使用することをお勧めします。

#!/usr/bin/env python
from html5lib import HTMLParser, treebuilders

parser = HTMLParser(tree=treebuilders.getTreeBuilder("beautifulsoup"))

c = """<HTML>
    <HEAD>
        <TITLE>Title</TITLE>
        <HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
    </HEAD>
    <BODY>
        ...
        ...
    </BODY>
</HTML>"""

soup = parser.parse(c)
print soup.prettify()

出力:

<html>
 <head>
  <title>
   Title
  </title>
 </head>
 <body>
  <http-equiv="pragma" content="NO-CACHE">
   ...
        ...
  </http-equiv="pragma">
 </body>
</html>

ただし、この場合、出力は html5lib が問題を修正していないことを示しています。

于 2009-03-12T13:20:25.427 に答える
3

lxml (およびその html モジュール) を試してください。その名前にもかかわらず、HTML の解析とスクレイピングにも使用されます。BeautifulSoup よりもはるかに高速で、"壊れた" HTML の処理も BeautifulSoup よりも優れています。lxml API を学習したくない場合は、BeautifulSoup 用の互換 API もあります。

Ian Blicking も同意見です。

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

于 2009-08-03T15:40:41.023 に答える
2

あなたの問題は別のものでなければなりません。それは私にとってはうまくいきます:

In [1]: import BeautifulSoup

In [2]: c = """<HTML>
   ...:     <HEAD>
   ...:         <TITLE>Title</TITLE>
   ...:         <HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
   ...:     </HEAD>
   ...:     <BODY>
   ...:         ...
   ...:         ...
   ...:     </BODY>
   ...: </HTML>
   ...: """

In [3]: print BeautifulSoup.BeautifulSoup(c).prettify()
<html>
 <head>
  <title>
   Title
  </title>
  <http-equiv>
  </http-equiv>
 </head>
 <body>
  ...
        ...
 </body>
</html>


In [4]: 

これは Python 2.5.2 と BeautifulSoup 3.0.7a です — 古いバージョンと新しいバージョンでは違うのでしょうか? これはまさに BeautifulSoup がとても美しく処理する種類のスープなので、どこかの時点で変更されたのではないかと思います.問題で言及されていない構造に何か他のものはありますか?

于 2009-01-19T23:40:08.300 に答える