1

私は大学にあるコースのリストをポーリングする webbot に取り組んでおり、これまでのところ、多くのことを成し遂げることができました。しかし、HTML パーサーに問題があります。契約は次のとおりです。各メジャーのコースのリストを個別に取得すると、返されるコースの配列は正しいです。しかし、次のようなforループで行うと

for major in allMajors:
    dictionary[major] = GetAllCourses(major)

問題は、辞書がコースを蓄積することです。たとえばif allMajors == ['MajorA', 'MajorB']、MajorB には MajorA と MajorB のコースが含まれます。これが私のコードです。

def UIUCGetCourses(major, s):
    url = "https://ui2web1.apps.uillinois.edu/BANPROD1/bwskfcls.P_GetCrse"
    payload = {u'sel_instr': [u'dummy'], u'sel_camp': [u'dummy', u'dummy'], 
      ...
    }

    r = s.post(url=url, data=payload)

    p = UIUCcoursesParser()
    p.feed(r.content)
    p.close()

    return p.courses, s

class UIUCcoursesParser(HTMLParser):
    print_data = False
    courses = []
    descriptions = []
    internal_string = ""

    def handle_starttag(self, tag, attr):
        if tag == 'td':
            for a in attr:                                  
                if a[0] == 'class' and a[1] == 'dddefault':
                    self.print_data = True

                if self.internal_string:
                    self.descriptions.append(self.internal_string)
                    self.internal_string = ""

    def handle_data(self, data):
        if self.print_data and data.isdigit():
            self.courses.append(data)
            self.print_data = False
        elif self.print_data:
            self.internal_string = self.internal_string + data.strip('\n')
4

2 に答える 2

1

問題が解決しました。私はばかです!問題はここにあります:

class UIUCcoursesParser(HTMLParser):
    print_data = False
    courses = []
    descriptions = []
    internal_string = ""

これらの変数はクラス変数であり、インスタンス変数ではありません。http://legacy.python.org/doc/essays/ppt/acm-ws/sld051.htm

于 2013-08-06T13:24:23.317 に答える
0

問題は、本当にインスタンススコープが必要なときにクラススコープデータを使用していることだと思います:

class UIUCCoursesParse(HTMLParser):
    def __init__(self):
        super(UIUCCoursesParser, self).__init__()
        self.print_data = False
        self.courses = []
        self.descriptions = []
        self.internal_string = ""

あなたがそれを参照するときのあなたの他のクラスメソッドselfでは合法ですが、それはあなたが意図したものではないと思います:

    def handle_starttag(...):
        ...
        self.descriptions.append(self.internal_string)

これらはそれぞれ、作成するパーサー インスタンスの数に関係なく、単一のクラス スコープ変数に適用されます。

于 2013-08-06T13:25:26.860 に答える