MST

星途 面试题库

面试题:Python标准库在复杂类编程中的应用问题

设计一个网络爬虫类,要求利用Python标准库中的模块实现网页的抓取、解析以及数据持久化(存储到本地文件)。在这个类中,要处理可能出现的网络异常、页面编码识别等问题。请阐述实现思路并给出关键代码片段,说明使用了哪些标准库模块及其原因。
40.9万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 网页抓取:使用urllib.request模块发送HTTP请求获取网页内容。它是Python标准库中用于处理URL的模块,能方便地发起请求并获取响应。
  2. 页面编码识别:使用chardet库(非标准库,但简单易用,可通过pip安装)来自动识别网页的编码格式。因为不同网页可能使用不同编码,手动指定容易出错。
  3. 解析网页:使用html.parser模块来解析HTML内容,它是Python标准库中专门用于解析HTML的模块,能以事件驱动的方式处理HTML文档。
  4. 数据持久化:使用io模块中的open函数(Python标准的文件操作方式)将解析后的数据写入本地文件,以实现数据的存储。
  5. 异常处理:使用try - except语句捕获urllib.request在请求过程中可能抛出的异常,如网络连接失败、HTTP错误等。

关键代码片段

import urllib.request
import chardet
from html.parser import HTMLParser
import io


class WebCrawler:
    def __init__(self, url, output_file):
        self.url = url
        self.output_file = output_file

    def fetch_page(self):
        try:
            response = urllib.request.urlopen(self.url)
            page_content = response.read()
            encoding = chardet.detect(page_content)['encoding']
            return page_content.decode(encoding, errors='ignore')
        except urllib.request.URLError as e:
            print(f"网络请求出现异常: {e}")
            return None

    def parse_page(self, page_content):
        if page_content:
            class MyHTMLParser(HTMLParser):
                def handle_data(self, data):
                    with io.open(self.output_file, 'a', encoding='utf - 8') as f:
                        f.write(data + '\n')

            parser = MyHTMLParser()
            parser.feed(page_content)


if __name__ == "__main__":
    url = "http://example.com"
    output_file = "output.txt"
    crawler = WebCrawler(url, output_file)
    page_content = crawler.fetch_page()
    crawler.parse_page(page_content)

使用的标准库模块及其原因

  1. urllib.request:用于发送HTTP请求并获取网页响应,是Python标准库中处理URL请求的基础模块,功能全面且易于使用。
  2. html.parser:是Python标准库中解析HTML的模块,以事件驱动方式处理HTML文档,适合简单的HTML解析需求,使用方便且无需额外安装。
  3. io:提供了通用的I/O操作接口,open函数是Python文件操作的基础,能方便地实现数据的持久化存储到本地文件。