2

BeautifulSoup newbe... ヘルプが必要

これがコードサンプルです...

from mechanize import Browser
from BeautifulSoup import BeautifulSoup

mec = Browser()
#url1 = "http://www.wines.com/catalog/index.php?cPath=21"
url2 = "http://www.wines.com/catalog/product_info.php?products_id=4866"
page = mec.open(url2)
html = page.read()
soup = BeautifulSoup(html)

print soup.prettify()

url1 を使用すると、ページのすばらしいダンプが得られます。url2(必要なもの)を使用する場合。本体なしで出力を取得します。

<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
<html dir="LTR" lang="en">
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>
   2005 Jordan Cabernet Sauvignon Sonoma 2005
  </title>
 </head>
</html>

何か案は?

4

4 に答える 4

2

はい。HTMLが悪い。

ステップ 1a で、print soup.prettify()インデントが正しく停止する場所を確認します。

ステップ 1b (1a が機能しない場合)。HTML の整形で raw を印刷するだけです。Beautiful Soup を混乱させるものには BBEdit を使用します。

HTMLをよく見てください。ある種の恐ろしいエラーが発生します。誤字脱字"はよくあることです。また、スタイルとして与えられたときの CSS background-image には不適切な引用符があります。

<tag style="background-image:url("something")"> 

「不適切な」引用符に注意してください。これらを見つけて修正するには、正規表現を作成する必要があります。

ステップ 2. 「マッサージ」正規表現と関数を記述して、これを修正します。マークアップ メッセージの作成方法については、http://www.crummy.com/software/BeautifulSoup/documentation.html#Sanitizing%20Bad%20Data%20with%20Regexpsセクションを参照してください。

私がよく使うのはこちら

# Fix background-image:url("some URI")
# to replace the quotes with &quote;
background_image = re.compile(r'background-image:url\("([^"]+)"\)')
def fix_background_image( match ):
    return 'background-image:url(&quote;%s&quote;)' % ( match.group(1) )
# Fix <img src="some URI name="someString"">  -- note the out-of-place quotes
bad_img = re.compile( r'src="([^ ]+) name="([^"]+)""' )
def fix_bad_img( match ):
    return 'src="%s" name="%s"' % ( match.group(1), match.group(2) )
fix_style_quotes = [
    (background_image, fix_background_image),
    (bad_img, fix_bad_img),
]
于 2009-11-09T01:38:46.330 に答える
2

この悪いタグにつまずいているようです:

<META NAME="description" CONTENT="$49 at Wines.com "Deep red. Red- and blackcurrant, cherry and menthol on the nose, with subtle vanilla, cola and tobacco notes adding complexity. Tightly wound red berry and bitter cherry flavors are framed by dusty...">

明らかにここで、属性値内の引用符をエスケープできませんでした (うーん... サイトはクロスサイト スクリプティングに対して脆弱である可能性がありますか?)。これにより、パーサーはページの残りのコンテンツがすべて属性内にあると認識します。値。(間違いに気付くには、実際の属性値の別の値"または内側の値が必要になると思います。)>

残念ながら、これは後で修正するのが非常に難しいエラーです。おそらく、少し異なるパーサーを試すことができますか? 例えば。Soup 3.1.x のバージョンを使用している場合は、3.1.x の代わりに Soup 3.0.x を試してください。逆の場合も同様です。または、html5lib を試してください。

于 2009-11-09T01:47:37.887 に答える
1

HTML は確かにひどいものです :-) BeautifulSoup 3.0.7 は、現在のバージョンよりも不正な HTML の処理がはるかに優れています。プロジェクトの Web サイトは次のように警告しています。3、BS 3.1.x は Py3k に変換できるように書かれています。

良いニュースは、3.0.7a (最新バージョン) を引き続きダウンロードできることです。これは、私のマシンで、あなたが言及した URL を完全に解析します: http://www.crummy.com/software/BeautifulSoup/download/3.x/

于 2009-11-09T01:46:46.173 に答える
0

問題の HTML で実行すると、バリデーターは 116 個のエラーを表示します -- 多すぎて、どの BeautifulSoup が回復できないことが証明されているかを突き止めることができません:-(

html5libは、この恐ろしいページを解析するという試練を乗り切ったようで、多くのものを残しています (html5lib のパーサーを使用して BeautifulSoup オブジェクトを生成する場合、prettify には元のページのほぼすべてが含まれているように思えます)。結果の解析ツリーが必要なことを行うかどうかはわかりません;-)

注:最後の公式リリースは少し長いので、hg クローン ソース (ディレクトリから)python setup.py installから直接 html5lib をインストールしました。html5lib/python

于 2009-11-09T01:46:32.773 に答える