كيفية إصلاح غير متوافق مع 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) على نظام لينكس مع -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("&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.إذا كنت تريد في نهاية المطاف مع شجرة DOM أو ساكس تيار في جاوة ، إنها تذكرة.إذا كنت ترغب فقط في استخراج معلومات محددة ، شوربة جميلة هو شيء جميل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top