Python 常用内建模块-HTMLParser

目录

HTMLParser

小结

练习


HTMLParser

如果我们要编写一个搜索引擎,第一步是用爬虫把目标网站的页面抓下来,第二步就是解析该HTML页面,看看里面的内容到底是新闻、图片还是视频。

假设第一步已经完成了,第二步应该如何解析HTML呢?

HTML本质上是XML的子集,但是HTML的语法没有XML那么严格,所以不能用标准的DOM或SAX来解析HTML。

好在Python提供了HTMLParser来非常方便地解析HTML,只需简单几行代码:

from html.parser import HTMLParser
from html.entities import name2codepoint

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print('<%s>' % tag)

    def handle_endtag(self, tag):
        print('' % tag)

    def handle_startendtag(self, tag, attrs):
        print('<%s/>' % tag)

    def handle_data(self, data):
        print(data)

    def handle_comment(self, data):
        print('')

    def handle_entityref(self, name):
        print('&%s;' % name)

    def handle_charref(self, name):
        print('&#%s;' % name)

parser = MyHTMLParser()
parser.feed('''



    

Some html HTML tutorial...
END

''')

feed()方法可以多次调用,也就是不一定一次把整个HTML字符串都塞进去,可以一部分一部分塞进去。

特殊字符有两种,一种是英文表示的 ,一种是数字表示的Ӓ,这两种字符都可以通过Parser解析出来。

小结

利用HTMLParser,可以把网页中的文本、图像等解析出来。

练习

找一个网页,例如Our Events | Python.org,用浏览器查看源码并复制,然后尝试解析一下HTML,输出Python官网发布的会议时间、名称和地点。

示例代码:

from DrissionPage import ChromiumPage
from html.parser import HTMLParser

# 初始化浏览器
page = ChromiumPage()

# 打开目标网页
url = "https://www.python.org/events/python-events/"
page.get(url)

# 打印页面标题,确认页面加载成功
print("页面标题:", page.title)

# 等待页面加载完成
try:
    # 等待事件列表加载完成
    page.wait.eles_loaded('css:.list-recent-events', timeout=10)
    print("事件列表加载完成")
except Exception as e:
    print("等待事件列表加载失败:", e)

# 获取页面源码
html_content = page.html

# 打印页面源码(仅前1000个字符)
print("页面源码(部分):", html_content[:10000])

# 关闭浏览器
page.quit()

# 自定义HTML解析器
class PythonEventsParser(HTMLParser):
    def __init__(self):
        super().__init__()
        self.events = []
        self.current_event = {}
        self.in_event = False
        self.in_time = False
        self.in_location = False

    def handle_starttag(self, tag, attrs):
        if tag == "li" and ("class", "event") in attrs:
            self.in_event = True
            self.current_event = {}
        elif self.in_event:
            if tag == "time":
                self.in_time = True
            elif tag == "span" and ("class", "event-location") in attrs:
                self.in_location = True

    def handle_data(self, data):
        if self.in_event:
            if self.in_time:
                self.current_event["time"] = data.strip()
                self.in_time = False
            elif self.in_location:
                self.current_event["location"] = data.strip()
                self.in_location = False
            elif "name" not in self.current_event:
                self.current_event["name"] = data.strip()

    def handle_endtag(self, tag):
        if tag == "li" and self.in_event:
            self.events.append(self.current_event)
            self.in_event = False

# 解析HTML内容
parser = PythonEventsParser()
parser.feed(html_content)

# 输出会议信息
if parser.events:
    for event in parser.events:
        print(f"会议名称: {event.get('name', '未提供')}")
        print(f"会议时间: {event.get('time', '未提供')}")
        print(f"会议地点: {event.get('location', '未提供')}")
        print("-" * 40)
else:
    print("未找到会议信息")

你可能感兴趣的:(Python,系统学习,python,开发语言)