Python中用urllib与findall提取HTML标题并显示到GUI遇阻
解决正则匹配
标签内容的问题
嘿,我看了你的代码,发现几个关键问题导致你找不到目标标题,咱们一步步来修正:
问题1:正则匹配了转义实体而非真实标签
你写的正则是'<h3>(.*)</h3>',但实际上解码后的HTML内容里,标签是用<h3>和</h3>表示的,不是转义后的<h3>——这直接导致正则找不到任何匹配项,相当于你在找一个根本不存在的字符串。
问题2:没考虑
标签带属性的情况
去看Metacritic的页面源码,目标标题所在的
其实是带class属性的,比如:
Lovecraft's Untold Stories
你原正则只会匹配纯<h3>标签,自然抓不到带属性的目标标签。
问题3:没开启DOTALL模式跨行匹配
默认正则模式下,.不会匹配换行符,如果标题内容或者标签本身跨行了,.*就会匹配失败。你需要启用re.DOTALL让.能匹配包括换行在内的所有字符。
修正后的完整代码
import urllib.request import re from tkinter import Tk, Label def game_function(): game = Tk() game.geometry('600x400') game.title('Upcoming Video Game Releases') game.resizable(0,0) # 可切换使用本地文件URL或在线URL # url = "file:///D:/Riz/Poppie%202/Upcoming%20Video%20Game%20Releases%20for%202019%20-%20Metacritic.html" url = "https://www.metacritic.com/browse/games/release-date/coming-soon/all/date" # 访问在线URL需添加请求头,避免被反爬拦截 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'} req = urllib.request.Request(url, headers=headers) with urllib.request.urlopen(req) as response: encoding = response.info().get_param('charset', 'utf8') html = response.read().decode(encoding) # 修正后的正则:匹配带任意属性的<h3>,非贪婪捕获内容 title_tag = r'<h3\s*.*?>(.*?)</h3>' # 启用DOTALL模式,处理跨行情况 title_list = re.findall(title_tag, html, re.DOTALL) # 从匹配结果里筛选目标标题 target_title = next((title.strip() for title in title_list if title.strip() == "Lovecraft's Untold Stories"), "Title not found") print("匹配到的部分标题:", title_list[:5]) print("找到的目标标题:", target_title) title1_subtitle = Label(game, text=target_title, bg='white', fg='black', font=('Arial', 14, 'bold')) title1_subtitle.place(relx=0.8, rely=0.49, anchor='e') # 添加anchor让标签对齐更合理 title1_subtitle.configure(wraplength='260') game.mainloop() game_function()
关键修改点说明
- 正则修正:
r'<h3\s*.*?>(.*?)</h3>'<h3\s*.*?>:匹配任何带有空格、属性的起始标签,覆盖页面里的实际标签格式
(.*?):用非贪婪匹配,避免一次性抓取多个<h3>到</h3>之间的所有内容,确保只抓单个标签内的标题
- 启用DOTALL:让正则能处理标签或内容跨行的情况,不会因为换行导致匹配中断
- 请求头添加:访问Metacritic在线页面时必须模拟浏览器请求,否则会返回403禁止访问
- 目标标题筛选:用生成器表达式快速从匹配列表里找到你要的“Lovecraft's Untold Stories”,找不到就显示默认提示
小提示
虽然正则解析HTML确实容易因为页面结构变动失效,但既然你被限制只能用这些工具,这个方案应该能完美解决你的问题。如果用本地文件的话,确保你的URL编码是正确的(你原代码里的本地URL没问题)。
内容的提问来源于stack exchange,提问作者Joe Julen
相关产品推荐
相关产品推荐

