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

如何用Python结合BeautifulSoup与正则提取script标签内的链接后缀

解决方案

你的正则表达式只匹配了/images/部分,因为/images/*的写法有误——这里的*是正则量词,作用是匹配前面的/零次或多次,而非任意字符。要提取完整的url后缀,有两种可行方法:

方法1:修正正则表达式

直接调整正则规则,精准匹配url字段对应的完整路径:

修改代码中的正则部分:

import re
import requests
from bs4 import BeautifulSoup

url = 'https://esahubble.org/images/archive/category/galaxies/page/1/'
reqs = requests.get(url)
soup = BeautifulSoup(reqs.text, 'html.parser')
image_script = soup.find('script')
# 使用捕获组提取完整链接后缀
image_links = re.findall(r"url: '(/images/[^']+)'", str(image_script))

print(image_links)

正则说明:

  • url: ' 匹配字段的固定前缀
  • (/images/[^']+) 捕获组:匹配从/images/开始,直到下一个单引号'的所有字符([^']+表示匹配非单引号的任意字符至少一次)
  • ' 匹配字段的固定后缀引号

执行后会直接得到完整的链接后缀数组,比如['/images/heic2018b/', '/images/potw1345a/', '/images/heic0817a/']。

方法2:解析为JSON(更可靠)

script标签内的内容是类JSON结构,仅缺少键名的双引号。我们可以先将其转换为合法JSON,再用json模块解析,这种方法能避免正则可能出现的匹配误差:

import re
import requests
import json
from bs4 import BeautifulSoup

url = 'https://esahubble.org/images/archive/category/galaxies/page/1/'
reqs = requests.get(url)
soup = BeautifulSoup(reqs.text, 'html.parser')
image_script = soup.find('script').string

# 将类JSON的键名添加双引号,转换为合法JSON格式
valid_json = re.sub(r'(\w+):', r'"\1":', image_script)
# 将多个独立对象包裹为数组
valid_json = f"[{valid_json}]"

try:
    images_data = json.loads(valid_json)
    # 提取所有存在url字段的内容
    image_links = [item['url'] for item in images_data if 'url' in item]
    print(image_links)
except json.JSONDecodeError as e:
    print(f"解析JSON出错: {e}")

逻辑说明:

  • 用re.sub把无引号的键名(如id:、url:)替换为带双引号的格式("id":、"url":)
  • 将处理后的内容包裹成数组[...],使其符合JSON数组结构
  • 解析后直接遍历提取每个对象的url字段,这种方法对字段顺序变化、特殊字符兼容性更强

内容的提问来源于stack exchange,提问作者Brandon Benton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:33:10