2013-01-24 1 views
0

저는 파이썬으로 작은 텍스트 스크래핑 스크립트를 작성하고 있습니다. 그것은 내가 처음으로 큰 프로젝트이므로 몇 가지 문제가 있습니다. 나는 urllib2와 BeautifulSoup를 사용하고 있습니다. 하나의 재생 목록에서 노래 이름을 긁어 내고 싶습니다. 하나의 노래 이름이나 모든 노래 이름 + 내가 필요로하지 않는 다른 문자열을 얻을 수 있습니다. 나는 모든 노래 이름만을 얻을 수는 없다.BeautifulSup 및 정규 표현식 - 태그에서 텍스트 추출

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

그것은 그래서 얻을 수 실제로하지 루프입니다 : 나에게 노래 한 곡을 제공

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] 

그리고 코드 : 내가 필요로하지 않는 모든 노래 이름 + 다른 문자열을 얻을 내 코드 하나 이상은 아니지만 루프를 만들려고하면 같은 노래 이름이 10 개나납니다. 코드 :

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

저는 하루 종일 멈추었 고 작동하지 않습니다. 나는이 것들이 어떻게 작동하는지 이해하지 못한다.

답변

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') 대신 findAll('tr')   [0]의 모든 TR 년대를 반복하고 싶습니다.
  2. 일부 행 TD를 포함하지 않는, 그래서 우리는 1과
  3. 먼저 TD에서 모두의 원하는 (이 줄을 제거하려고) AttributeError를 방지하기 위해이를 생략 할뿐만 아니라 "for td in tr.find"없습니다 " for td in soup.find "이라고 말하면서 전체 문서 (soup)에없는 tr을보고 싶습니다.
+0

'td'없이 행을 건너 뛰는 아이디어가 우수합니다. 그 페이지가'tbody' 태그도 사용했다면 더 쉬웠을 것입니다. –

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> 태그를 사용했다면 그것은 더 나은 모든 주위했을 것이다. :-)

관련 문제