web-dev-qa-db-ja.com

美しいスープに入れ子になった要素を取得する方法

Tdでいくつかのhrefを取得するために必要な構文に苦労しています。 table、tr、およびtd要素には、クラスまたはIDはありません。

この例でアンカーを取得したい場合、何が必要ですか?

<tr> <td> <a>.。

ありがとう

16
joepour

ドキュメントに従って、最初に解析ツリーを作成します。

import BeautifulSoup
html = "<html><body><tr><td><a href='foo'/></td></tr></body></html>"
soup = BeautifulSoup.BeautifulSoup(html)

次に、その中で検索します。たとえば、直接の親が<a>である<td>タグを検索します。

for ana in soup.findAll('a'):
  if ana.parent.name == 'td':
    print ana["href"]
26
Alex Martelli

このようなもの?

_from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(html)
anchors = [td.find('a') for td in soup.findAll('td')]
_

これにより、提供するhtmlの各「td」内の最初の「a」が見つかります。 _td.find_を微調整してより具体的にするか、各td内に複数のリンクがある場合はfindAllを使用できます。

更新:ダニエレのコメントに関して、リストにNoneがないことを確認したい場合は、リスト内包表記を次のように変更できます。

_from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(html)
anchors = [a for a in (td.find('a') for td in soup.findAll('td')) if a]
_

これは基本的に、td.find('a')によって返される実際の要素があるかどうかを確認するためのチェックを追加するだけです。

24
John Montgomery