كيفية إصلاح غير متوافق مع 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
) على نظام لينكس مع-xml
الخيار لكن مرتبة التقارير 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 بحيث لا يمكن تحليل ذلك مع المغتربين?
المحلول
هناك فلاش على أساس لصناعة السيارات في تحديث اللوحة الشيء في الجزء العلوي من nfl.com.بعض رصد حركة مرور الشبكة يجد:
http://www.nfl.com/liveupdate/scorestrip/ss.xml
أن من المحتمل أن يكون أسهل قليلا إلى تحليل من HTML اللوحة.
نصائح أخرى
إنهم يستخدمون نوعا من جافا سكريبت على درجة صناديق لذا عليك أن تلعب أكثر الحيل الذكية (خط فواصل لي):
/* 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>
قد يكون من الأسهل أن تتخلص ياهو انتصاره اللوحة, في رأيي...في الواقع ، من أن تحاول ذلك.
تحرير: تستخدم سؤالك ذريعة للالتفاف على التعلم BeautifulSoup.أليكس مارتيلي قد تغني مدح لها, لذلك أنا أحسب أنه يستحق المحاولة-يا رجل, أنا أعجب.
على أية حال, كنت قادرا على سلق بدائية درجة مكشطة من ياهو!اللوحة مثل:
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.إذا كنت تريد في نهاية المطاف مع شجرة DOM أو ساكس تيار في جاوة ، إنها تذكرة.إذا كنت ترغب فقط في استخراج معلومات محددة ، شوربة جميلة هو شيء جميل.