BeautifulSoup爬取njlottery中奖号码表格无法定位问题
问题原因
- BeautifulSoup只能解析你发起HTTP请求拿到的初始静态HTML源码,它本身不具备执行JavaScript的能力。你在源码里看到的带
((__t=...))的片段是前端模板引擎的未渲染代码,目标表格的最终class、甚至表格内的中奖号码行数据,都是页面加载后靠JavaScript动态拼接、异步拉取数据填充生成的,这些内容不会出现在初始返回的静态源码里。 - 你在浏览器元素检查面板看到的是JS执行完成后的最终DOM树,和直接请求拿到的静态源码本身就不是同一份内容,自然靠静态源码查找表格会找不到。
解决方法
- 优先推荐直接抓数据接口:打开浏览器开发者工具的「网络」面板,筛选Fetch/XHR类型请求,在页面触发开奖数据加载操作时,找到直接返回中奖号码结构化数据的接口,直接请求该接口拿数据即可,不需要解析HTML,稳定性和效率都更高。
- 如果要走页面解析的路线,替换成可执行JS的爬虫工具:用
playwright或者selenium模拟真实浏览器加载页面,等页面JS执行完毕、目标表格渲染完成后,再提取页面内容做解析。参考代码如下:
from playwright.sync_api import sync_playwright from bs4 import BeautifulSoup with sync_playwright() as p: # 启动无头浏览器 browser = p.chromium.launch(headless=True) page = browser.new_page() # 替换成你要爬取的具体开奖页面地址 page.goto("目标njlottery开奖页URL") # 等待目标表格加载完成 page.wait_for_selector("table.cardcash-winning-numbers") # 拿到渲染完成后的完整HTML rendered_html = page.content() browser.close() soup = BeautifulSoup(rendered_html, "html.parser") # 匹配class时不要写完整class串,因为后缀会根据彩种动态变化,匹配固定存在的class值即可 target_table = soup.find("table", class_=lambda class_val: class_val and "cardcash-winning-numbers" in class_val)
- 做元素匹配时不要硬编码完整class字符串:目标表格的class会根据彩种(PICK3/PICK4)动态拼接
-pick后缀,只要匹配固定存在的class标识(比如cardcash-winning-numbers)就可以,避免动态class导致匹配失败。
内容的提问来源于stack exchange,提问作者Bob Brendel
相关产品推荐
相关产品推荐

