私は大学にあるコースのリストをポーリングする 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')