0

这是我们为 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在课堂上,为什么还是有必要的?

4

1 回答 1

1
  1. 它没有被调用;你是从它继承的;MyHTMLParser被调用来创建类的一个实例。

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

    有关完整 API,请参阅html.parser模块文档。如果您真的想知道这一切是如何工作的,您可以尝试理解完整的html.parser源代码。

  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这将为每个元素存储元素文本,如果下一个元素与您的str1全局变量匹配,那么它也会与教授姓名一起打印。

您可能想考虑使用BeautifulSoup来获得更直观的 HTML 解析器 API。

于 2013-06-13T12:12:40.390 回答