1

私はBeautifulSoup(BS4)を使用して最初のパーサーを作成しようとしており、概念的な問題にぶつかっていると思います。私はPythonをあまり使っていません-私はPHPがはるかに得意です。

BeautifulSoupで必要なテーブルを見つけることができますが、テーブルに足を踏み入れてすべての行を見つけようとすると、次のようなバリエーションがあります。

AttributeError: 'ResultSet' object has no attribute 'attr'

urllib2を使用してPythonで開いたURLから特定のデータを引き出すにはどうすればよいですか?でサンプルコードをウォークスルーしてみました。ほぼ同じエラーが発生しました(注:試してみたい場合は、有効なURLが必要です)。

私が読んでいることのいくつかは、問題はResultSetがリストであるということだと言っています。どうすればそれを知ることができますか?私がそうするならprint type(table)それはただ私に言う<class 'bs4.element.ResultSet'>

私は次のような表のテキストを見つけることができます:

for row in table:
    text = ''.join(row.findAll(text=True))
    print text

しかし、私がHTMLを検索しようとすると、次のようになります。

for row in table:
    text = ''.join(row.find_all('tr'))
    print text

それではexpected string, Tag found、この文字列(HTMLでいっぱいの文字列)を解析可能な美しいスープオブジェクトに戻すにはどうすればよいですか?

4

1 に答える 1

3

BeautifulSoupのデータ型は控えめに言っても奇妙です。多くの場合、彼らはパズルを簡単につなぎ合わせるのに十分な情報を提供していません。私はあなたの痛みを知っています!とにかく...私の答えに...

あなたのコードをもっと見たり、あなたがスクレイプしようとしている実際のサイトを知らずに完全に正確な例を提供するのは難しいですが、私は最善を尽くします。

問題はあなた''.join()です。.findAll('tr')BeautifulSoupデータ型'tag'の要素のリストを返します。BSがtrsを見つけることを知っている方法。このため、間違ったデータ型をに渡しています''.join()

もう1回繰り返しコーディングする必要があります。(sがtd付いたタグがあると思いますtr

text_list = []
for row in table:
    table_row = row('tr')
    for table_data in table_row:
        td = table_data('td')
        for td_contents in td:
            content = td_contents.contents[0]
            text_list.append(content)
text = ' '.join(str(x) for x in text_list)

これにより、テーブルの内容全体が1つの文字列に返されます。とtextの位置を変更するだけで、の値を調整できます。text_listtext =

これはおそらく必要以上のコードのように見えますが、それは本当かもしれませんが、この方法で実行すると、スクレイプがはるかに徹底的かつ正確であることがわかりました。

于 2012-10-16T18:36:27.787 に答える