私は Web サイトのクロールに BeautifulSoup 4 を使用しており、魅力的に機能するスクリプトを生成しました。しかし、コンピューターを変更して別のコンピューターでスクリプトを実行しようとすると、突然エラーが発生し始めました。エラーの原因は、BS の新機能であり、最新バージョンで有効な css 検索を使用したことです。特定の検索は次のようになります。
soup.findAll(class_="class-name")
"class-name" は Web ページに存在し、動作していることは確かです。問題は、新しいコンピュータが Web ページの解析に失敗し、"class-name" という名前のクラスを検出できないことです。ご想像のとおり、上記の検索では空のリストが返されます。
html5lib
とを一緒にインストールしlxml
ましたが、単独でも何も変わりませんでした。次の行を使用して、lxml
および2つの異なるケースでBSが解析することを確認しました。html5lib
page = urllib2.urlopen("url")
soup = BeautifulSoup(page.read(),"html5lib")
また
soup = BeautifulSoup(page.read(),"lxml")
そして、再び何も変わりませんでした。検索は空のリストを返します。これについて私を助けてください。ちなみに、私は要点の答えを探しています。BSに正しい解析を作成させるのを手伝ってください。スクリプトを大幅に変更する必要があるようなアドバイスはしないでください。前に言ったように、それは機能しています。
前もって感謝します。
コメントに照らして、失敗した短い例を含めます。ちなみに、Pythonを除いて、すべてのバージョンは両方のコンピューターで同じです。スクリプトが動作するコンピューターには pyhton 2.6 があり、もう 1 つのコンピューターには 2.7 があります。しかし、これが理由だとは思いません。
from bs4 import BeautifulSoup
import urllib2
page = urllib2.urlopen("www.website.com/some extensions...")
soup = BeautifulSoup(page.read())
#Now I need information that is included in a class called any_class. The info's
#html tag is 'i' and I want to extract the text in that tag, for the first appearance
#of any_class on the page
text = soup.findAll(class_="any_class")[0].i.text
次に、コマンド ラインに移動してスクリプトを実行します。
$ ./crawler.py
#Index Error! List out of Index!
これですべてが明確になったことを願っています。ご覧のとおり、soup.findAll は「any_class」のクラス検索に対して空のリストを返します。BS は明らかに、ページ上でかろうじて見つかった「any_class」を見つけることができません。問題はパーサーの問題であると強く信じています。Python は、インストールした lxml と html5lib の代わりに、デフォルトの「html.parser」を使用することを主張していると思います。BSのlxmlまたはhtml5libで解析したいことをpythonに宣言する方法についての短いガイドを回答に含めることもできます。