기본 페이지에서 여행 통계가 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에서 쉼표를 제거하십시오.
질문에 대한 답변을 얻으려면 동의를 클릭하십시오. – smci