私は 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