1

全体をコンテンツ管理システムに移行するという長期的な目標を持って、友人の (不格好な場合は構造化された) Web サイトをスクレイピングするプロセスをたどることで、BeautifulSoup と Python の方向性を理解しています。

soup = BeautifulSoup(urllib2.urlopen("http://www.bicyclepaintings.com/archive/index.html")コンソールで正確に 1 つのセル ( ) を引き出すと、次のようになります。

cell = soup.find_all('td',{'valign':'bottom'})[3]

部分文字列を引き出して遊ぶことができます。これらはすべて正常に動作します: cell.br.next_sibling, cell.find('b').text. しかし、for ループですべてのセルをループしようとすると、次のようになります。

def parse_archive(url):
    soup = get_soup(url)
    paintings = []
    for cell in soup.find_all('td',{'valign':'bottom'}):
        painting_title = cell.find('b').text
        painting_media = cell.br.next_sibling 
        record = painting_title, painting_media
        paintings.append(record)
    return paintings

属性エラー ( AttributeError: 'NoneType' object has no attribute 'text') が表示されます。ループバックすることで、同じ情報の一部を取得できます。

    for item in cell.find_all('b'):
        painting_title = item.text

しかし、兄弟に到達する方法が<br/>わかりません (より要点を言えば) 1 つのアイテムを引き出すと機能するのに、for ループを介してそれらにアクセスしようとすると機能しない理由がわかりません。ここで何が欠けていますか?

4

1 に答える 1

0

あなたの問題は、スクレイピングしようとしているサイト<td>の末尾にタグが含まれていないタグがたくさんあることです<b>:

<td nowrap valign="bottom"><!-- painting image -->
<p><font><!-- painting data, use &quot; for quotes --></font></p></td>
<td nowrap valign="bottom"><!-- painting image -->
<p><font><!-- painting data, use &quot; for quotes --></font></p></td>
<td nowrap valign="bottom"><!-- painting image -->
<p><font><!-- painting data, use &quot; for quotes --></font></p></td>
<td nowrap valign="bottom"><!-- painting image -->
<p><font><!-- painting data, use &quot; for quotes --></font></p></td>
<td nowrap valign="bottom"><!-- painting image -->
<p><font><!-- painting data, use &quot; for quotes --></font></p></td>
<td nowrap valign="bottom"><!-- painting image -->
<p><font><!-- painting data, use &quot; for quotes --></font></p></td>

これらのタグを無視するようにコードを変更するだけです。

for cell in soup.find_all('td',{'valign':'bottom'}):
    title = cell.find('b')
    if title is None:
        continue
    painting_title = title.text
    painting_media = cell.br.next_sibling 
    record = painting_title, painting_media
    paintings.append(record)

一致する限り、painting_media次を使用できます:

painting_media = list(cell.br.children)
painting_media = painting_media[0].strip() if painting_media else ''
于 2012-10-26T04:28:45.400 に答える