python- beautifulsoupは私のhtmlを誤って報告していますか?
-
03-07-2019 - |
質問
私の知る限り、それぞれ2台のマシンがあり、python 2.5とBeautifulSoup 3.1.0.1を実行しています。
http://utahcritseries.com/RawResults.aspx をスクレイピングしようとしています。 :
from BeautifulSoup import BeautifulSoup
import urllib2
base_url = "http://www.utahcritseries.com/RawResults.aspx"
data=urllib2.urlopen(base_url)
soup=BeautifulSoup(data)
i = 0
table=soup.find("table",id='ctl00_ContentPlaceHolder1_gridEvents')
#table=soup.table
print "begin table"
for row in table.findAll('tr')[1:10]:
i=i + 1
col = row.findAll('td')
date = col[0].string
event = col[1].a.string
confirmed = col[2].string
print '%s - %s' % (date, event)
print "end table"
print "%s rows processed" % i
Windowsマシンでは、正しい結果が得られます。これは、日付とイベント名のリストです。私のMacではそうではありません。代わりに、私は得る
3/2/2002 - Rocky Mtn Raceway Criterium
None - Rocky Mtn Raceway Criterium
3/23/2002 - Rocky Mtn Raceway Criterium
None - Rocky Mtn Raceway Criterium
4/2/2002 - Rocky Mtn Raceway Criterium
None - Saltair Time Trial
4/9/2002 - Rocky Mtn Raceway Criterium
None - DMV Criterium
4/16/2002 - Rocky Mtn Raceway Criterium
気づいているのは、私が
print row
Windowsマシンでは、trデータはソースhtmlとまったく同じに見えます。 2番目のテーブル行のスタイルタグに注意してください。最初の2行は次のとおりです。
<tr>
<td>
3/2/2002
</td>
<td>
<a href="Event.aspx?id=226">
Rocky Mtn Raceway Criterium
</a>
</td>
<td>
Confirmed
</td>
<td>
<a href="Event.aspx?id=226">
Points
</a>
</td>
<td>
<a disabled="disabled">
Results
</a>
</td>
</tr>
<tr style="color:#333333;background-color:#EFEFEF;">
<td>
3/16/2002
</td>
<td>
<a href="Event.aspx?id=227">
Rocky Mtn Raceway Criterium
</a>
</td>
<td>
Confirmed
</td>
<td>
<a href="Event.aspx?id=227">
Points
</a>
</td>
<td>
<a disabled="disabled">
Results
</a>
</td>
</tr>
最初の2行を印刷するMacでは、スタイル情報がtrタグから削除され、各tdフィールドに移動されます。なぜこれが起こっているのか分かりません。 BeautifulSoupは他のすべての日付の周りにフォントタグを配置しているため、他のすべての日付値に対してNoneを取得しています。 Macの出力は次のとおりです。
<tr>
<td>
3/2/2002
</td>
<td>
<a href="Event.aspx?id=226">
Rocky Mtn Raceway Criterium
</a>
</td>
<td>
Confirmed
</td>
<td>
<a href="Event.aspx?id=226">
Points
</a>
</td>
<td>
<a disabled="disabled">
Results
</a>
</td>
</tr>
<tr bgcolor="#EFEFEF">
<td>
<font color="#333333">
3/16/2002
</font>
</td>
<td>
<font color="#333333">
<a href="Event.aspx?id=227">
Rocky Mtn Raceway Criterium
</a>
</font>
</td>
<td>
<font color="#333333">
Confirmed
</font>
</td>
<td>
<font color="#333333">
<a href="Event.aspx?id=227">
Points
</a>
</font>
</td>
<td>
<font color="#333333">
<a disabled="disabled">
Results
</a>
</font>
</td>
</tr>
Windowsでスクリプトが正しい結果を表示しています。Macを正しく動作させるために何をする必要がありますか?
解決
BeautifulSoupではなく、urlib2リクエストに問題があると思われます:
両方のマシンでこのコマンドによって返される生データの同じセクションを表示すると役立つ場合があります:
urllib2.urlopen(base_url)
このページは役立つと思われます: http://bytes.com/groups/python/635923- building-browser-like-get-request
最も単純な解決策は、おそらくスクリプトが実行されている環境を検出し、それに応じて解析ロジックを変更することです。
>>> import os
>>> os.uname()
('Darwin', 'skom.local', '9.6.0', 'Darwin Kernel Version 9.6.0: Mon Nov 24 17:37:00 PST 2008; root:xnu-1228.9.59~1/RELEASE_I386', 'i386')
またはマイクロソフトにウェブ標準を使用させる:)
また、mechanizeを使用してページを取得しませんでしたか?その場合、問題がある可能性があります。
他のヒント
BeautifulSoupバージョン3.1には文書化された問題があります。
実際に使用しているバージョンを再確認したい場合は、ダウングレードしてください。