如何用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
相关产品推荐
相关产品推荐

