15

<table>多くの sを含む html コードがあります。

2 番目のテーブルの情報を取得しようとしています。を使用せずにこれを行う方法はありsoup.findAll('table')ますか?

を使用するsoup.findAll('table')と、エラーが発生します。

ValueError: too many values to unpack

一部のコードまたはすべてのテーブルを通過する必要のない別の方法で n 番目のタグを取得する方法はありますか? または、テーブルにタイトルを追加できるかどうかを確認する必要がありますか? (のように<table title="things">)

<h4>title</h4>それが役立つ場合は、各テーブルの上にヘッダー ( ) もあります。

ありがとう。

編集

質問をして思ったことは以下のとおりです。

オブジェクトを 2 つの値にアンパックしていましたが、さらに多くの値がありました。これでリストの最初の 2 つが得られるだけだと思っていましたが、もちろん、上記のエラーが表示され続けました。私は戻り値がリストであることを知らず、それが特別なオブジェクトか何かであると考え、コードを友人のコードに基づいていました。

このエラーは、ページにテーブルが多すぎてすべてを処理できないことを意味していると考えていたので、使用していた方法を使用せずにそれを行う方法を求めていました. 私はおそらく物事を仮定するのをやめるべきだった.

これで、リストが返されることがわかりました。これを for ループで使用したり、 で値を取得したりできますsoup.findAll('table')[someNumber]。開梱とは何か、その使い方も学びました。助けてくれたみんなに感謝します。

私の質問は、私が質問したときよりも意味をなさないことがわかったので、私が考えていたことをここにメモしておくことにしました.

編集2:

この質問は今ではかなり古いものですが、自分が何をしているのかがはっきりしていなかったことが今でもわかります。

それが誰かに役立つ場合、私はfindAll(...)結果を解凍しようとしていましたが、その量はわかりませんでした。

useless_table, table_i_want, another_useless_table = soup.findAll("table");

ページには、私が推測したテーブルの量が常にあるとは限らず、タプル内のすべての値をアンパックする必要があるため、次のメッセージを受け取りましたValueError

ValueError: too many values to unpack

そこで、使用されたテーブルの数に関するエラーに遭遇することなく、返されたタプルの 2 番目 (またはいずれかのインデックス) のテーブルを取得する方法を探していました。

4

3 に答える 3

30

call から 2 番目のテーブルを取得するにはsoup.findAll('table')、それをリストとして使用し、インデックスを付けるだけです。

secondtable = soup.findAll('table')[1]
于 2012-12-30T22:58:31.783 に答える
2

Martjin Pieter の答えは、それを実際に機能させるでしょう。table注意を払わずにリストの2番目のテーブルを取得するだけで、コードが壊れるネストされたタグを使用した経験がありました。

n 番目の要素を取得しようとするfind_allと、混乱する可能性があります。必要な最初の要素を見つけて、n 番目の要素が実際にはその要素の子ではなく兄弟であることを確認することをお勧めします。

  1. を使用しfind_next_sibling()てコードを保護できます
  2. 最初に親を見つけてから、 find_all(recursive=False) を使用して検索範囲を保証できます。

必要な場合に備えて。以下にコードをリストします(recursive = FALSEを使用)。

import urllib2
from bs4 import BeautifulSoup

text = """
<html>
    <head>
    </head>
    <body>
        <table>
            <p>Table1</p>
            <table>
                <p>Extra Table</p>
            </table>
        </table>
        <table>
            <p>Table2</p>
        </table>
    </body>
</html>
"""

soup = BeautifulSoup(text)

tables = soup.find('body').find_all('table')
print len(tables)
print tables[1].text.strip()
#3
#Extra Table # which is not the table you want without warning

tables = soup.find('body').find_all('table', recursive=False)
print len(tables)
print tables[1].text.strip()
#2
#Table2 # your desired output
于 2013-11-03T17:13:48.727 に答える