欢迎访问宙启技术站
智能推送

Python中HTMLParser模块处理多个HTML文档的实例

发布时间:2024-01-10 09:33:45

HTMLParser模块是Python的内置模块,用于解析HTML文档。它提供了一个解析器类HTMLParser,可以根据HTML文档的结构和标记来处理文档中的内容。

在处理多个HTML文档时,我们可以通过继承HTMLParse来自定义一个解析器类,然后按照需要重写其中的方法。

下面是一个处理多个HTML文档的示例,我们将使用HTMLParser模块来解析HTML文档,并提取出文档中的标题、链接和图片。

from html.parser import HTMLParser
from urllib.request import urlopen

# 自定义的解析器类
class MyHTMLParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.is_title = False
        self.is_link = False
        self.is_image = False
        
    def handle_starttag(self, tag, attrs):
        # 处理开始标记
        if tag == 'title':
            self.is_title = True
        elif tag == 'a':
            for attr in attrs:
                if attr[0] == 'href':
                    print('Link:', attr[1])
        elif tag == 'img':
            for attr in attrs:
                if attr[0] == 'src':
                    print('Image:', attr[1])
        
    def handle_data(self, data):
        # 处理文本内容
        if self.is_title:
            print('Title:', data)
            self.is_title = False

# 处理多个HTML文档
def handle_multiple_html(urls):
    for url in urls:
        response = urlopen(url)  # 打开URL
        html = response.read().decode('utf-8')  # 读取HTML内容
        parser = MyHTMLParser()  # 创建解析器对象
        parser.feed(html)  # 解析HTML文档
        parser.close()  # 关闭解析器

# 测试代码
if __name__ == '__main__':
    urls = ['http://example.com', 'http://example.org']
    handle_multiple_html(urls)

在上面的例子中,首先自定义了一个类MyHTMLParser,继承自HTMLParser。在这个类中,我们重写了handle_starttag方法和handle_data方法,分别用于处理开始标记和文本内容。

在handle_starttag方法中,我们判断如果是<title>标记,则将is_title标记设置为True,表示接下来要处理标题内容;如果是<a>标记,则遍历其属性,找到href属性,并打印出链接;如果是<img>标记,则遍历其属性,找到src属性,并打印出图片链接。

在handle_data方法中,我们判断如果is_title标记为True,则打印出标题内容,并将is_title标记设置为False,表示标题内容已经处理完毕。

然后,在handle_multiple_html方法中,我们循环处理多个HTML文档。首先使用urlopen函数打开URL,获取HTML内容,然后创建MyHTMLParser的实例对象parser,对HTML内容进行解析,最后关闭解析器。

最后,我们在测试代码中定义了两个URL,然后调用handle_multiple_html方法,传入这两个URL进行处理。

以上是Python中使用HTMLParser模块处理多个HTML文档的例子。通过自定义的解析器类,我们可以根据需要提取出HTML文档中的内容,并进行相应的处理。