2011-08-15 4 views
2

에서 기계화하는 방법이 사이트의 테이블에서 데이터를 추출하고 싶습니다. http://www.pgatour.com/r/stats/info/xm.html?101 그런 다음 .csv로 저장하고 iWorks Numbers 시트로 가져와야합니다. 저는 Python, BeautifulSoup로 시도해 왔고 기계화했습니다. 나는 지식없이 다른 예제를 보았지만 성공하지 못했습니다.Python, BeautiflSoup로 웹 데이터를 추출하고 테이블

from BeautifulSoup import BeautifulSoup, SoupStrainer 
from mechanize import Browser 
import re 
br = Browser() 
response = br.open("http://www.pgatour.com/r/stats/info/xm.html?101").read() 

그럼 내가 불을 지르고와 코드를보고 난 <tbody></tbody> 사이에있는 데이터를 분석 할 필요가 같은데요 : 내가 여기까지왔다. 그러나 나는 이것을 어떻게하는지 모른다. 도움을 주시면 감사하겠습니다.

+0

질문에 대한 답변을 얻으려면 동의를 클릭하십시오. – smci

답변

4

기본 페이지에서 여행 통계가 JavaScript로 채워지는 것 같습니다 <div class="tourViewData"> ... populateDDs(); BS는 Javascript를 구문 분석하지 않습니다. 다른 많은 SO 질문을 참조하십시오. (최악의 경우, 해당 HTML 선택을 로컬 html 파일로 선택하여 임시 해결 방법으로 저장하는 것이 좋습니다.)

먼저 해당 URL에 대해 BeautifulSoup 개체로 s를 설정합니다 나는), 능 직물하지 원료 기계화를 사용 여기 기계화 동등한를 넣어 :

from BeautifulSoup import BeautifulSoup, SoupStrainer 
#from mechanize import Browser 
from twill.commands import * 
import re 

go("http://www.pgatour.com/r/stats/info/xm.html?101") 
s = BeautifulSoup(get_browser().get_html()) 

어쨌든 당신이 찾고있는 통계의 테이블이 <tbody><tr class="tourStatTournHead"> 태그 테이블입니다. 그냥 약간 괴팍하게 만들려면 행의 태그 속성을 <tr class="tourStatTournCellAlt" 또는 <tr class=""...으로 번갈아 지정하십시오. 첫 번째 <tr class="tourStatTournCellAlt"을 검색 한 다음 헤더 행 ( <tr class="tourStatTournHead">)을 제외한 그 이후의 테이블에서 <tr>을 모두 처리해야합니다.

이 행을 반복하려면 (. 그것은에 포함 된 타이틀리스트 로고가있는 경우, 그것은 수도 있고 계층하지 않을 수 있습니다)
tbl = s.find('table', {'class':'tourStatTournTbl'}) 

def extract_text(ix,tg): 
    if ix==2: # player name field, may be hierarchical 
     tg = tg.findChildren()[0] if (len(tg.findChildren())>0) else tg 
    return tg.text.encode() 

for rec in tbl.findAll('tr'): # {'class':'tourStatTournCellAlt'}): 
    # Skip header rows 
    if (u'tourStatTournHead' in rec.attrs[0]): 
     continue   
    # Extract all fields 
    (rank_tw,rank_lw,player,rounds,avg,tot_dist,tot_drives) = \ 
     [extract_text(i,t) for (i,t) in enumerate(rec.findChildren(recursive=False))] 
    # ... do stuff 

우리는 플레이어의 이름에 대한 도우미 함수를 추가 아마 당신이 원하는 player (string) 및 avg (float)를 제외한 대부분의 필드를 int()로 변환합니다. 그렇다면 랭크 필드에서 선택적인 'T'(묶여있는)를 제거하고 tot_dist에서 쉼표를 제거하십시오.

+0

시간과 노력에 감사드립니다! 코드 입력 시도 중이 오류가 발생했습니다. – Mikael

+0

시간과 노력에 감사드립니다! 코드를 입력하려고하는데 다음 오류가 나타납니다 : >>> tbl = s.find ('table', { 'class': 'tourStatTournTbl'}) 추적 (가장 최근 통화 마지막) : 파일 "", 줄 1 , in NameError : name 's'이 (가) 정의되지 않았습니다. 여러분의 코드가 훌륭하다고 생각하고 잘못된 것입니다. 더 이상 당신의 시간을 낭비하고 싶지 않아요. 시도하기 전에 파이썬을 제대로 배워야한다고 생각합니다. 나는 당신의 코드를 복사하고 더 많은 파이썬을 연구하고 나중에 다시 시도 할 것이다. 대단히 감사합니다 !!! – Mikael

+0

은 해당 URL에 대한 BeautifulSoup 객체 여야합니다. (기계화하지 않은 능 직물을 사용했습니다.) – smci

관련 문제