0

我正在用 Python 编写一个小的文本抓取脚本。这是我的第一个更大的项目,所以我遇到了一些问题。我正在使用 urllib2 和 BeautifulSoup。我想从一个播放列表中抓取歌曲名称。我可以获得一首歌曲名称或所有歌曲名称+我不需要的其他字符串。我无法仅获得所有歌曲名称。我的代码获取所有歌曲名称+我不需要的其他字符串:

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]

和给我一首歌的代码:

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

它实际上不是一个循环,所以我只能得到一个,但如果我尝试让它循环,我会得到大约 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. 您想遍历所有 tr,因此findAll('tr')而不是findAll('tr') [0].
  2. 有些行不包含td,所以我们需要跳过它们以避免AttributeError(尝试删除此行)
  3. 如在 1 中,您希望所有 a 都在第一个 td 中,但也需要 " for td in tr.find",而不是 " for td in soup.find",因为您要查看tr的不是整个文档 ( soup)。
于 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 回答