关于HTML解析的问题

时间:2013-06-13 11:07:11

标签: python parsing python-3.x html-parsing global-variables

这是我们为html解析编写的程序。 它运作得很好。

我们在网上找到了一个演示程序,我们根据需要对其进行了修改。 但我们不明白它是如何运作的。

import urllib
from urllib.request import urlopen


address='http://www.iitb.ac.in/acadpublic/RunningCourses.jsp?deptcd=EE&year=2012&semester=1'
print(address)
source= urlopen(address).read()
source=str(source)


from html.parser import HTMLParser

str1 = input('Enter name of prof:')

class MyHTMLParser(HTMLParser):
    y=" "
    def handle_data(self, data):
        flag=0
        x=str(data)
        for i in range(len(x)):
            if (x[i]=='\\'):
                flag=1
                break
        if(flag==0) :
            if(x==str1):
                global y
                print("Name of professor:",x)
                print("Name of course:",y) 
            y=x

parser = MyHTMLParser(strict=False)
parser.feed(source)

我们的问题:

  1. 为什么必须首先调用班级HTMLparser

  2. 为什么要调用该函数handle_data,该函数如何工作?

  3. 尽管global y属于班级本身,为什么y仍然必要?

1 个答案:

答案 0 :(得分:1)

  1. 没有被召唤;你是继承而已;调用MyHTMLParser来创建类的实例。

  2. handle_data()HTMLParser代码调用;您的子类会覆盖它以处理文档中的文本数据。通过调用.feed()实例上的MyHTMLParser,即可启动该过程。

    有关完整的API,请参阅html.parser module文档。如果您真的想知道这一切是如何运作的,您可以尝试理解full html.parser source code

  3. 你发现的例子实际上是做错了。 global y引用不同的 y变量,该变量位于模块范围内。该行显示该示例的原始开发人员不了解他们正在做什么。 global y行不是唯一的例子;在其他方面,代码可以更加Pythonic。

    类范围中的y定义否则未使用。 handle_data()方法应改为self.y

    class MyHTMLParser(HTMLParser):
        y = None
    
        def handle_data(self, data):
            if '\\' not in data:
                if data == str1:
                    print("Name of professor:", data)
                    print("Name of course:", self.y) 
                self.y = x
    

    这会将元素文本存储在每个元素的self.y中,如果 next 元素与您的str1全局变量匹配,那么它也会与教授的名字。

  4. 您可能希望使用BeautifulSoup代替更直观的HTML解析器API。