0

Pythonで小さなテキストスクレイピングスクリプトを書いています。これは私の最初の大きなプロジェクトなので、いくつか問題があります。urllib2とBeautifulSoupを使用しています。1つのプレイリストから曲名を取得したい。1つの曲名またはすべての曲名+不要な他の文字列を取得できます。すべての曲名だけを取得することはできません。すべての曲名と不要なその他の文字列を取得するコード:

import urllib2
from bs4 import BeautifulSoup
import re

response = urllib2.urlopen('http://guardsmanbob.com/media/playlist.php?char=a').read()
soup = BeautifulSoup(response)

for tr in soup.findAll('tr')[0]:
    for td in soup.findAll('a'):
        print td.contents[0]

そして私に1曲を与えるコード:

print soup.findAll('tr')[1].findAll('a')[0].contents[0]

実際にはループではないので、1つしか取得できませんが、ループにしようとすると、同じ曲名が10個くらいになります。そのコード:

for tr in soup.findAll('tr')[1]:
    for td in soup.findAll('td')[0]:
        print td.contents[0]

私は今一日立ち往生していて、それを動かすことができません。これらがどのように機能するのかわかりません。

4

2 に答える 2

1
for tr in soup.findAll('tr'):  # 1
    if not tr.find('td'): continue  # 2
    for td in tr.find('td').findAll('a'):  # 3
        print td.contents[0]
  1. findAll('tr')したがって、の代わりに、すべてのtrを反復処理する必要がありfindAll('tr') [0]ます。
  2. 一部の行にはtdが含まれていないため、AttributeErrorを回避するためにそれらをスキップする必要があります(この行を削除してみてください)
  3. 1の場合と同様に、最初のtdにすべてのaが必要ですが、ドキュメント全体ではなく'を調べたいので、for td in tr.find""ではなく" "も必要です( )。for td in soup.findtrsoup
于 2013-01-24T18:28:58.800 に答える
1

検索をもう少し具体的にしてから、テーブルの行をループするだけです。cssクラスで特定のテーブルを取得し、trスライスを使用して最初の要素を除く要素をループし、最初からすべてのテキストを取得しtdます。

table = soup.find('table', class_='data-table')
for row in table.find_all('tr')[1:]:
    print ''.join(row.find('td').stripped_strings)

thead最初の行を切り取る代わりに、次のことをテストしてスキップすることもできます。

for row in table.find_all('tr'):
    if row.parent.name == 'thead':
        continue
    print ''.join(row.find('td').stripped_strings)

<tbody>ページが代わりに適切なタグを使用していれば、いたるところにあったはずです。:-)

于 2013-01-24T18:39:13.260 に答える