使用HTMLParser缓冲问题

时间:2013-08-06 13:05:47

标签: python html-parsing

我正在开发一个网站,我的大学就其所拥有的课程列表进行了调查,到目前为止,我已经完成了很多工作。但是我在使用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')

2 个答案:

答案 0 :(得分:1)

问题解决了。我是一个白痴!问题出在这里:

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

这些变量是类变量而不是实例变量。 http://legacy.python.org/doc/essays/ppt/acm-ws/sld051.htm

答案 1 :(得分: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)

无论您创建多少个解析器实例,每个都适用于单个类范围变量。