비준수 HTML을 수정하는 방법이므로 국외 거주자가 구문 분석됩니다 (htmltidy 작동하지 않음)
-
06-07-2019 - |
문제
나는 정보를 긁어 내려고 노력하고 있습니다 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">
하지만
그것을 구문 분석하려는 시도 국외 거주자 오류를 생성합니다
not well-formed (invalid token)
.그만큼 W3C의 온라인 검증 서비스 399 개의 오류 및 121 개의 경고를보고합니다.
나는 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(" ", "")
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 스트림으로 끝나고 싶다면 티켓입니다. 특정 정보를 추출하고 싶다면 아름다운 수프는 아름다운 것입니다.