0

毎日いくつかの情報を表示する小さなユーティリティ スクレーパーをコーディングしました。これは 100% 確実に実行され、ローカルで実行してもまったく問題はありません。接続を開き、BeautifulSoup オブジェクトを作成し、そのコンテンツをスクレイピングして、すべてを画面に出力します。すべては順調です。

しかし、App Engine で同じコードを実行すると、何らかの理由で突然解析エラーが発生します。

コードは可能な限り簡単です。

    url = 'MY_URL'
    agent = ('Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 '
        '(KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31')

    headers = {'User-Agent' : agent}

    data = urllib.urlencode(form_data)
    req = urllib2.Request(url, headers=headers, data=data)
    return urllib2.urlopen(req).read()

それで、これはページを開きます。次に、このページを取得して、次のように解析しますBeautifulSoup

page = get_page()
soup = BeautifulSoup(page)

それでおしまい。私が言ったように、うまくいきます。このスクリプトをローカルで何百回も問題なく実行しました。さて、App Engine に貼り付けようと思いました。リクエストが問題になると思っていましたurllibが、コードが失敗している場所がBeautifulSoup呼び出しにあることがわかりました。

AppEngine のログに次のエラーが表示されます。

soups = [BeautifulSoup(response) for response in responses]
  File "libs\bs4\__init__.py", line 172, in __init__
    self._feed()
  File "libs\bs4\__init__.py", line 185, in _feed
    self.builder.feed(self.markup)
  File "libs\bs4\builder\_htmlparser.py", line 150, in feed
    raise e
HTMLParseError: expected name token at u'<! /notices/notice.c', at line 51, column 3

リクエストが AppEngine から行われたときに正しいページを取得していることを確認しました。だから…私は完全に迷っています。解析の問題が突然発生するのはなぜですか?

4

1 に答える 1

1

パーサーのインストールについては、BeautifulSoup の注意事項を参照してください。BeautifulSoup は、サード パーティのパーサーを使用して、システムにインストールされているものをlxml最優先で選択します。

各パーサーには長所と短所があり、一部のパーサーは他のパーサーよりも寛大です。ローカル システムに AppEngine の作業領域とは異なるパーサー セットがインストールされている可能性があり、AppEngine ではより緩いパーサーが使用されています。

bs4/builder/__init__.py現在サポートされているパーサーとその優先順位のリストについては、BeautifulSoup ソースの下部にあるコードを参照してください。

于 2013-05-17T02:51:07.557 に答える