1

Python と BeautifulSoup4 で興味深い問題が発生しています。私のメソッドは、与えられたレストラン (dict キー) によってその日の地元の学生レストランのメニューを取得し、それらを表示します。

def fetchFood(restaurant):
  # Restaurant id's
  restaurants = {'assari': 'restaurant_aghtdXJraW5hdHIaCxISX1Jlc3RhdXJhbnRNb2RlbFYzGMG4Agw', 'delica': 'restaurant_aghtdXJraW5hdHIaCxISX1Jlc3RhdXJhbnRNb2RlbFYzGPnPAgw', 'ict': 'restaurant_aghtdXJraW5hdHIaCxISX1Jlc3RhdXJhbnRNb2RlbFYzGPnMAww', 'mikro': 'restaurant_aghtdXJraW5hdHIaCxISX1Jlc3RhdXJhbnRNb2RlbFYzGOqBAgw', 'tottisalmi': 'restaurant_aghtdXJraW5hdHIaCxISX1Jlc3RhdXJhbnRNb2RlbFYzGMK7AQw'}

if restaurants.has_key(restaurant.lower()):
  soup = BeautifulSoup(urllib.urlopen("http://murkinat.appspot.com"))
  meal_div = soupie.find(id="%s" % restaurants[restaurant.lower()]).find_all("td", "mealName hyphenate")
  mealstring = "%s: " % restaurant
  for meal in meal_div:
    mealstring += "%s / " % meal.string.strip()
  mealstring = "%s @ %s" % (mealstring[:-3], "http://murkinat.appspot.com")
return mealstring

else:
  return "Restaurant not found"

これは私の IRCBot の一部になる予定ですが、現在はテスト マシン (Python 2.7.3 を使用した Ubuntu 12.04) でのみ動作しますが、ボットを実行している他のマシン (Python 2.6.5 を使用した Xubuntu) では失敗します。

ラインの後

soup = BeautifulSoup(urllib.urlopen("http://murkinat.appspot.com"))

>>> type(soup)
<class 'bs4.BeautifulSoup'>

私はそれを印刷することができ、あるはずのすべてのコンテンツを持っていることを示していますが、何でも見つけることができます. 私がこれを行う場合:

>>> print soup.find(True)
None

>>> soup.get_text()
u'?xml version="1.0" encoding="utf-8" ?'

他のマシンではすべてを完全に読み取りますが、最初の行まで読み取りを停止します。

出力は次のようになります (この日付のレストラン パラメータ「Tottisalmi」を使用した作業マシンから):

    Tottisalmi: Sveitsinleike, kermaperunat / Jauheliha-perunamusaka / Uuniperuna, kylmäsavulohitäytettä / Kermainen herkkusienikastike @ http://murkinat.appspot.com

私はこれについて完全に無知です。ボットで問題なく機能する類似の種類の BeautifulSoup 解析メソッドが多数あります (URL のタイトルとウィキペディアのものを解析します) が、これは私を悩ませ続けます。

誰にもアイデアはありますか?他のどこでも BeautifulSoup4 が正常に動作するため、奇妙に聞こえる私の Python バージョンと関係があるとしか思えません。

4

1 に答える 1

2

2 台のマシンに異なるパーサーがインストールされていると思います。指定されたマークアップで html5lib パーサーが失敗し、不適切な動作が発生します。lxml および html.parser パーサーはマークアップを正しく解析し、悪い動作をしません。

複数のマシンで実行されるコードを記述する場合は、使用するパーサーを明示的に指定することをお勧めします。

BeautifulSoup(data, "lxml")

これにより、適切なパーサーがインストールされていない場合にエラーが発生します。

于 2012-07-12T20:38:04.740 に答える