비준수 HTML을 수정하는 방법이므로 국외 거주자가 구문 분석됩니다 (htmltidy 작동하지 않음)

StackOverflow https://stackoverflow.com/questions/1814731

문제

나는 정보를 긁어 내려고 노력하고 있습니다 http://www.nfl.com/scores (특히 게임이 끝나는시기를 알아보십시오. 내 컴퓨터가 녹음을 중지 할 수 있습니다). HTML을 충분히 쉽게 다운로드 할 수 있으며 표준 준수에 대한이 주장을합니다.

<!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. 그것을 구문 분석하려는 시도 국외 거주자 오류를 생성합니다 not well-formed (invalid token).

  2. 그만큼 W3C의 온라인 검증 서비스 399 개의 오류 및 121 개의 경고를보고합니다.

  3. 나는 HTML Tidy를 실행하려고했다 (방금 불렸다 tidy) 내 Linux 시스템에서 -xml 옵션이지만 Tidy는 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의 일부인 것으로 보이므로 이중 견적이 어딘가에 누락되었는지 또는 무엇을 누락했는지 모르겠습니다.

나는 있다는 것을 알고 있습니다 무엇 Firefox와 W3M이 모두 합리적인 것을 표시하기 때문에이 물건을 구문 분석 할 수 있습니다. 비준수 HTML을 수정하여 국외 거주자로 구문 분석 할 수있는 도구는 무엇입니까?

도움이 되었습니까?

해결책

NFL.com 상단에는 플래시 기반 자동 업데이트 스코어 보드가 있습니다. 네트워크 트래픽에 대한 일부 모니터링은 다음과 같습니다.

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

그것은 아마도 HTML 스코어 보드보다 구문 분석하기가 조금 더 쉽습니다.

다른 팁

그들은 점수 상자에 일종의 JavaScript를 사용하고 있으므로 더 영리한 트릭을 연주해야합니다 (Line Breaks Mine).

/* 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>

긁는 것이 더 쉬울 수 있습니다 야후의 NFL 스코어 보드, 내 생각에 ... 사실, 그것을 시도하기 위해.


편집하다: 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)

어쨌든, 당신이 점프 할 수있는 페그. 행운을 빕니다.

들여다보다 tagsoup. Java의 Dom Tree 또는 Sax 스트림으로 끝나고 싶다면 티켓입니다. 특정 정보를 추출하고 싶다면 아름다운 수프는 아름다운 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top