You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 21:36:15