python - 如何使用正则表达式通过 BeautifulSoup 获取脚本内的链接
问题描述
这是我的代码:
videoresponse = s.get("https://platzi.com/clases/1272-sql-mysql/11085-bienvenidos-al-curso9999/")
soup = BeautifulSoup(videoresponse.content,'html5lib')
scripts = soup.findAll('hls')
print(scripts)#It doesnt works, just prints []
它包含带有一些<script></script>
标签的响应。其中一个有这段代码:
iframes: [],
videos: {"serverA": {"id": "serverA", "hls": "https://movin-b.platzi.com/080e9d74-4dbe-4de8-baa5-1fe3ae97f8a9/5ae7e0dee883414be4a13216.ism/manifest(format=m3u8-aapl,audio-only=false)", "dash": "https://movin-b.platzi.com/080e9d74-4dbe-4de8-baa5-1fe3ae97f8a9/5ae7e0dee883414be4a13216.ism/manifest(format=mpd-time-csf)"}, "serverB": {"id": "serverB", "hls": "https://movin.platzi.com/080e9d74-4dbe-4de8-baa5-1fe3ae97f8a9/5ae7e0dee883414be4a13216.ism/manifest(format=m3u8-aapl,audio-only=false)", "dash": "https://movin.platzi.com/080e9d74-4dbe-4de8-baa5-1fe3ae97f8a9/5ae7e0dee883414be4a13216.ism/manifest(format=mpd-time-csf)"}, "serverC": {"id": "serverC", "hls": "https://mdstrm.com/video/5ae7e0dee883414be4a13216.m3u8"}},
我需要提取链接:“m3u8”或换句话说,hls的值。在所有响应中只有三个“HLS”:和“m3u8”,所以,尝试使用 BeautifulSoup 我发现它只适用于 HTML 标签,或者在这种情况下,适用于正则表达式,但我不知道如何使用它。
有了这个,我将在响应中创建一个带有 m3u8 链接的数组,因为有时视频可用的服务器少于 3 个。
如果您能告诉我如何制作 re,我将不胜感激,我知道我需要导入 re 模块,但我不知道如何制作正则表达式以供使用。
解决方案
这种方式怎么样,只需使用python标准json api如下
import json
test = """{"serverA": {"id": "serverA", "hls": "https://movin-b.platzi.com/080e9d74-4dbe-4de8-baa5-1fe3ae97f8a9/5ae7e0dee883414be4a13216.ism/manifest(format=m3u8-aapl,audio-only=false)", "dash": "https://movin-b.platzi.com/080e9d74-4dbe-4de8-baa5-1fe3ae97f8a9/5ae7e0dee883414be4a13216.ism/manifest(format=mpd-time-csf)"}, "serverB": {"id": "serverB", "hls": "https://movin.platzi.com/080e9d74-4dbe-4de8-baa5-1fe3ae97f8a9/5ae7e0dee883414be4a13216.ism/manifest(format=m3u8-aapl,audio-only=false)", "dash": "https://movin.platzi.com/080e9d74-4dbe-4de8-baa5-1fe3ae97f8a9/5ae7e0dee883414be4a13216.ism/manifest(format=mpd-time-csf)"}, "serverC": {"id": "serverC", "hls": "https://mdstrm.com/video/5ae7e0dee883414be4a13216.m3u8"}}"""
all_servers = json.loads(test)
for server_key in all_servers:
print(all_servers[server_key]["hls"])
这是控制台输出
> https://movin-b.platzi.com/080e9d74-4dbe-4de8-baa5-1fe3ae97f8a9/5ae7e0dee883414be4a13216.ism/manifest(format=m3u8-aapl,audio-only=false) > https://movin.platzi.com/080e9d74-4dbe-4de8-baa5-1fe3ae97f8a9/5ae7e0dee883414be4a13216.ism/manifest(format=m3u8-aapl,audio-only=false) > https://mdstrm.com/video/5ae7e0dee883414be4a13216.m3u8
推荐阅读
- php - linux gpg命令→php gnupg库解释
- java - Selenium:ElementNotVisibleException 尝试在 https://www.phptravels.net/ 上单击带有文本作为我的帐户的元素
- c# - MVVM WPF 一项来源两个组合框不同的属性,第二个属性最初没有设置
- php - Laravel 不允许
- mysql - Rails 5.2 迁移难题,创建主键和外键
- sql - SQL Server 仅显示来自文本的选定文本 - 不起作用
- ruby-on-rails - 防止 Capistrano 部署询问多用户服务器密码
- c# - C# ICMPV6 SocketException:未知错误:-1
- c++ - Visual Studio 编译器的 record-gcc-switches 等效项是什么?
- c# - 多个ajax同时发送,时间响应慢