这是我们为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)
我们的问题:
为什么必须首先调用班级HTMLparser
?
为什么要调用该函数handle_data
,该函数如何工作?
尽管global y
属于班级本身,为什么y
仍然必要?
答案 0 :(得分:1)
没有被召唤;你是继承而已;调用MyHTMLParser
来创建类的实例。
handle_data()
由HTMLParser
代码调用;您的子类会覆盖它以处理文档中的文本数据。通过调用.feed()
实例上的MyHTMLParser
,即可启动该过程。
有关完整的API,请参阅html.parser
module文档。如果您真的想知道这一切是如何运作的,您可以尝试理解full html.parser
source code。
你发现的例子实际上是做错了。 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
全局变量匹配,那么它也会与教授的名字。
您可能希望使用BeautifulSoup代替更直观的HTML解析器API。