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

网页爬取时BeautifulSoup无法访问window对象提取正文的方案咨询

最优实现方案

你遇到的核心认知偏差是:目标站点的文章正文并不存在于需要JS执行才能生成的window动态属性中,而是以Schema.org标准的JSON-LD格式,静态嵌入在页面的<script type="application/ld+json">标签里。这类静态内容完全可以通过BeautifulSoup原生定位+Python标准库JSON解析提取,不需要写脆弱的全页正则匹配,也不需要引入浏览器渲染、JS执行之类的重依赖。

具体实现步骤

  • 用bs4定位页面中所有type="application/ld+json"的script标签,这类标签专门用来存放页面静态结构化元数据,不需要执行JS就能拿到完整内容
  • 遍历解析每个标签内的JSON文本,找到标记为NewsArticle/Article类型的文章节点
  • 直接从解析后的JSON字典中读取articleBody字段即可,JSON解析器会自动处理转义字符、引号嵌套等问题,不会出现匹配错误

可直接运行的代码示例

import json
import requests
from bs4 import BeautifulSoup

# 替换为目标新闻页地址
target_url = "待抓取的目标新闻页面地址"
# 加常规UA避免被反爬拦截
resp = requests.get(
    target_url,
    headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"}
)
resp.encoding = resp.apparent_encoding
soup = BeautifulSoup(resp.text, "html.parser")

article_content = None
for script_tag in soup.find_all("script", type="application/ld+json"):
    try:
        meta_data = json.loads(script_tag.string.strip())
        # 处理JSON结构为数组的情况
        if isinstance(meta_data, list):
            for item in meta_data:
                if item.get("@type") in ("NewsArticle", "Article") and "articleBody" in item:
                    article_content = item["articleBody"]
                    break
        # 处理JSON结构为单对象的情况
        elif isinstance(meta_data, dict):
            if meta_data.get("@type") in ("NewsArticle", "Article") and "articleBody" in meta_data:
                article_content = meta_data["articleBody"]
        if article_content:
            break
    except json.JSONDecodeError:
        # 跳过格式不合法的JSON块
        continue

print(article_content)

方案优势

  • 完全基于bs4原生能力和Python标准库实现,不需要额外引入第三方依赖
  • 适配性远高于字符串正则匹配:不会因为页面调整字段顺序(比如你正则里写死的keywords字段换位置、新增其他字段)就匹配失效
  • 自动处理转义问题:不会出现正则贪婪匹配导致的内容截断、转义字符残留、引号匹配错误等问题

特殊场景备选方案

如果后续碰到目标数据确实是JS运行时挂载到window对象的场景(静态源码里只有赋值语句,没有结构化JSON块),也不建议直接裸写正则匹配全页源码:

  • 优先用bs4定位到包含对应window赋值逻辑的script标签,缩小匹配范围后再做处理
  • 正则匹配时必须用非贪婪模式,比如你之前写的(.*)要改成(.*?),避免匹配到页面末尾的同名字段
  • 对提取精度要求高的场景,可以用轻量JS解释器直接执行对应script片段拿值,稳定性远高于手写正则

内容的提问来源于stack exchange,提问作者Sergio Olalla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:24:14