1

私は BeautifulSoup と RoboBrowser を使用して Web スクレイピング コンポーネントに取り組んでおり、特に 1 つのケースで奇妙な問題に遭遇しました。問題のページには、正常に動作する他のすべてのケースと同じクロムと構造がすべて含まれていますが、そのメイン データ フィールド (きれいにラベル付けされた div) は改行のない 1 つの巨大な行 (約 3000 文字の日本語テキスト) です。たくさんの BR タグ (テーブルをフォーマットするためにかなり恐ろしい方法で使用しています...) とフォーマット用のいくつかの SPAN タグが散りばめられていますが、本文全体は 1 行です。

それは問題ではないように思えますが、私のスクレーパーはRecursionError: maximum recursion depth exceeded in comparison、これらの行の数百 (おそらく数千) の同一のペアを吐き出した後、 で終了します。

File "/usr/local/lib/python3.5/site-packages/bs4/element.py", line 1126, in decode
  indent_contents, eventual_encoding, formatter)
File "/usr/local/lib/python3.5/site-packages/bs4/element.py", line 1195, in decode_contents
  formatter))

私はもともと BeautifulSoup のせいにしていて、膨大な数の BR タグが原因だと思っていましたが、実際には Unicode に問題があるようです。これをスローしているコードは次のとおりです。

File "/Users/myself/Projects/Scraper/scrape.py", line 207, in articles
  self._childtext = re.sub('<[^<]+?>', '', str(self._one_child).replace('<br/>', '\n'))
File "/usr/local/lib/python3.5/site-packages/bs4/element.py", line 1039, in __unicode__
  return self.decode()

行の長さかもしれないと思ったので、一度にすべてを行うのではなく、子ごとに DIV ブロックを解析しているのですが、少しも役に立ちませんでした。チャンクがどれほど小さくても、このstr(bsObject)関数は Unicode パーサーを非常識な狂乱に駆り立てているようです。

プロットを少し厚くするには; ページ ソースのテキスト全体を長い文字列として新しい Python サンドボックスにコピーしたので、Web サイトにログインし続けることなく、それに対してさまざまなコードをテストできました。テキストを vi で実行し、UTF8 として保存するように強制した後でも、Python はすぐにコードのコンパイルを拒否しました (UTF8 以外の文字が含まれていると不平を言いました)。ただし、テキストに改行を挿入して小さなチャンクに分割すると、テキスト自体の1文字を変更または削除していないにもかかわらず、このエラーが表示されなくなり、その時点でスクリプトはコンパイルされ、ページを完全にスクレイピングしました.

ここから先に進む方法がわかりません。私はスクレイピング元のサイトを管理していません。BeautifulSoup がそれに触れる前に、RoboBrowser の応答オブジェクトに改行を強制することを考えました。誰かが別のアプローチを提案できますか?

(残念ながら、私がデータをスクレイピングしているページにリンクすることはできません。これは、ログインが必要であり、個々のデータの永続的な URL を持っていない研究データ サプライヤーであるためです。)

編集:以下に完全なスタックトレースを追加...

Traceback (most recent call last):
  File "scrape.py", line 112, in <module>
    dataScrape()
  File "scrape.py", line 39, in dataScrape
    for article in scraper.articles():
  File "/Users/myself/Projects/Scraper/scrape.py", line 207, in articles
    self._childtext = re.sub('<[^<]+?>', '', str(self._one_child).replace('<br/>', '\n'))
  File "/usr/local/lib/python3.5/site-packages/bs4/element.py", line 1039, in __unicode__
    return self.decode()
  File "/usr/local/lib/python3.5/site-packages/bs4/element.py", line 1126, in decode
    indent_contents, eventual_encoding, formatter)
  File "/usr/local/lib/python3.5/site-packages/bs4/element.py", line 1195, in decode_contents
    formatter))
  File "/usr/local/lib/python3.5/site-packages/bs4/element.py", line 1126, in decode
    indent_contents, eventual_encoding, formatter)
  File "/usr/local/lib/python3.5/site-packages/bs4/element.py", line 1195, in decode_contents
    formatter))
#
# These lines repeat identically several hundred times, then...
#
  File "/usr/local/lib/python3.5/site-packages/bs4/element.py", line 1192, in decode_contents
    text = c.output_ready(formatter)
  File "/usr/local/lib/python3.5/site-packages/bs4/element.py", line 716, in output_ready
    output = self.format_string(self, formatter)
  File "/usr/local/lib/python3.5/site-packages/bs4/element.py", line 158, in format_string
    if not isinstance(formatter, collections.Callable):
  File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/abc.py", line 182, in __instancecheck__
    if subclass in cls._abc_cache:
  File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/_weakrefset.py", line 75, in __contains__
    return wr in self.data
RecursionError: maximum recursion depth exceeded in comparison
4

0 に答える 0