2009-11-29 4 views
1

http://www.nfl.com/scores에서 정보를 긁어 내려고하고 있습니다. 특히 게임이 끝나면 컴퓨터에서 기록을 중지 할 수 있습니다. 나는 충분히 쉽게 HTML을 다운로드 할 수 있으며, 표준 준수에 대한 이러한 주장한다 :준수하지 않는 HTML을 수정하여 Expat에서 구문 분석을 수행하는 방법 (htmltidy 작동하지 않음)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 

그러나

  1. Expat 그것을 구문 분석하는 시도가 오류 not well-formed (invalid token)을 생산하고 있습니다.

  2. W3C's online validation service은 오류 및 121 경고를보고합니다.

  3. 은 내가 -xml 옵션을 내 리눅스 시스템에서 (단지 tidy이라고) 단정 한 HTML을 실행하려고했으나 깔끔한 보고서 (56) 경고 및 117 오류 및 좋은 XML 파일을 복구 할 수 없습니다. 오류는 다음과 같이 :

    line 409 column 122 - Warning: unescaped & or unknown entity "&role" 
    ... 
    line 409 column 172 - Warning: unescaped & or unknown entity "&tabSeq" 
    ... 
    line 1208 column 65 - Error: unexpected </td> in <br> 
    line 1209 column 57 - Error: unexpected </tr> in <br> 
    line 1210 column 49 - Error: unexpected </table> in <br> 
    

    하지만 입력을 체크하면, "알 수없는 실체"는 적절하게 인용 된 URL의 일부로 표시되므로 이중 인용 부호 어딘가에 또는 어떤 누락 된 경우 나도 몰라 .

나는이 물건을 구문 분석 할 수 밖에 뭔가이 있다는 것을 알고 파이어 폭스와 합리적인 w3m 디스플레이 뭔가 모두 때문이다. 비 호환 HTML을 수정하여 Expat로 구문 분석 할 수있는 도구는 무엇입니까?

+0

wwf는 Expat? 해외에 살고있는 사람? – JohnIdol

+0

w3c 유효성 검사 서비스를 사용해 보셨습니까? -> http://validator.w3.org/#validate_by_input – JohnIdol

+1

Expat는 XML 구문 분석 라이브러리입니다. –

답변

3

nfl.com 상단에 플래시 기반 자동 업데이트 스코어 보드가 있습니다. 네트워크 트래픽의 일부 모니터링을 찾습니다

http://www.nfl.com/liveupdate/scorestrip/ss.xml

것은 아마도 HTML 점수 판보다 구문 분석 좀 더 쉽게됩니다.

+0

매우 영리하고 해석하기 쉽습니다. 그래도 그것이 군비 경쟁으로 이어질 지 궁금해. –

+0

이것은 실제로 제기 된 질문에 대답하지 않지만 내 실제 문제에 도움이되어 허용 된 답변으로 표시했습니다. 감사!!!!!! –

4
그들은 점수 상자에 자바 스크립트의 어떤 종류를 사용하고, 그래서 당신은 (라인 내 나누기) 더 영리한 트릭을 재생해야 할거야

:

/* box of awesome */ 
// iscurrentweek ? true; 
(new nfl.scores.Game('2009112905','54635',{state:'pre',container:'scorebox-2009112905', 
wrapper:'sb-wrapper-2009112905',template:($('scorebox-2009112905').innerHTML),homeabbr:'NYJ', 
awayabbr:'CAR'})); 

를하지만, 귀하의 질문에 대답하기 위해, BeautifulSoup로 그것을 (겉으로는) 구문 분석 미세 :

fp = urlopen("http://www.nfl.com/scores") 
data = "" 
while 1: 
    r = fp.read() 
    if not r: 
     break 
    data += r 
fp.close() 

soup = BeautifulSoup(data) 
print soup.contents[2].contents[1].contents[1] 

출력 :

<title>NFL Scores: 2009 - Week 12</title> 

내 의견으로는 Yahoo's NFL scoreboard을 긁어 내기가 더 쉬울 수도 있습니다 ... 실제로 시도해보십시오. BeautifulSoup로 학습으로 해결하기 위해 변명으로 질문을 사용 : 편집


. 알렉스 마르 텔리 (Alex Martelli)는 그 칭찬을 부르고 있었기 때문에 시험해 볼만한 가치가 있다고 생각했습니다.

어쨌든, 나는 야후!에서 초보적인 점수 긁는 도구를 요리 할 수 ​​있었다. 그래서 같은 점수 판은 : 정말 거친로

def main(): 
    soup = BeautifulSoup(YAHOO_SCOREBOARD) 
    on_first_team = True 
    scores = [] 
    hold = None 

    # Iterate the tr that contains a team's box score 
    for item in soup(name="tr", attrs={"align": "center", "class": "ysptblclbg5"}): 
     # Easy 
     team = item.b.a.string 

     # Get the box scores since we're industrious 
     boxscore = [] 
     for quarter in item(name="td", attrs={"class": "yspscores"}): 
      boxscore.append(int(quarter.string)) 

     # Final score 
     sub = item(name="span", attrs={"class": "yspscores"})[0] 
     if sub.b: 
      # Winning score 
      final = int(sub.b.string) 
     else: 
      data = sub.string.replace("&nbsp;", "") 
      if ":" in data: 
       # Catch TV: XXX and 0:00pm ET 
       final = None 
      else: 
       try: final = int(data) 
       except: final = None 

     if on_first_team: 
      hold = { team : (boxscore, final) } 
      on_first_team = False 
     else: 
      hold[team] = (boxscore, final) 
      scores.append(hold) 
      on_first_team = True 

    for game in scores: 
     print "--- Game ---" 
     for team in game: 
      print team, game[team] 

나는 그것이 어떻게 작동하는지보기 위해 일요일에이를 조정할 것이다. 바로 지금 출력되는 내용은 다음과 같습니다.

--- Game --- 
Green Bay ([0, 13, 14, 7], 34) 
Detroit ([7, 0, 0, 5], 12) 
--- Game --- 
Oakland ([0, 0, 7, 0], 7) 
Dallas ([3, 14, 0, 7], 24) 

저도 그렇게 생각합니다.아직 일어나지 않은 게임의 경우 다음과 같이 표시됩니다.

--- Game --- 
Washington ([], None) 
Philadelphia ([], None) 

어쨌든 당신이 뛰어 내릴 수있는 말뚝. 행운을 빕니다.

+0

BeautifulSoup가 멋지다! +1 –

+0

오, 그래, 수프. 그것은 또한 좋다. – bmargulies

+0

나는 그것을 조사했고 BeautifulSoup은 HTML을 거의 완벽하게 지우지 만, 밖으로 내뱉는 XML에는 여전히 5 개의 오류가있다. (이것은'prettify' 메소드를 사용한 결과물입니다.) 인프라의 나머지 부분이 루아에 있기 때문에 스프에 너무 깊이 들어가기를 꺼려합니다. 그래서 아마도 XML 피드를 먼저 시도 할 것입니다. 그러나 이것은 여전히 ​​알아두면 좋은 것입니다. –

2

tagsoup을 살펴보십시오. 자바에서 DOM 트리 또는 SAX 스트림으로 끝내고 싶다면, 그것은 티켓이다. 특정 정보 만 추출하려는 경우 Beautiful Soup은 아름다운 것입니다.

+0

데비안 패키지는 실행되지 않지만 정말 유용합니다. Grrrr. +1. 고마워. –

+0

대개는 데비안을 통해 Java를 사용하지 않습니다. – bmargulies