使用BeautifulSoup4 Python从javascript源代码中提取变量值

使用BeautifulSoup4 Python从javascript源代码中提取变量值,javascript,python,html,Javascript,Python,Html,我是python编程的新手。我正在学习beautifulsoup废弃网站 我想提取“stream”的值并将其存储到我的变量中 我的Python代码如下所示: import bs4 as bs #Importing BeautifulSoup4 Python Library. import urllib.request import requests import json import re headers = {'User-Agent':'Mozilla/5.0'} url = "http:

我是python编程的新手。我正在学习beautifulsoup废弃网站

我想提取“stream”的值并将其存储到我的变量中

我的Python代码如下所示:

import bs4 as bs #Importing BeautifulSoup4 Python Library.
import urllib.request
import requests
import json
import re

headers = {'User-Agent':'Mozilla/5.0'}
url = "http://thoptv.com/partners/mhdTVlive/Core.php?level=1200&channel=Dsports_HD"

page = requests.get(url)
soup = bs.BeautifulSoup(page.text,"html.parser")
pattern = re.compile('var stream = (.*?);')
scripts = soup.find_all('script')

for script in scripts:
   if(pattern.match(str(script.string))):
       data = pattern.match(script.string)
       links = json.loads(data.groups()[0])
       print(links)
这是获取流url值的源javascript代码

https://content.jwplatform.com/libraries/oncyToRO.js'>if(navigator.userAgent.match(/android/i)|| navigator.userAgent.match(/webOS/i)|| navigator.userAgent.match(/iPhone/i)|| navigator.userAgent.match(/iPad/i)|| navigator.userAgent.match(/iPod/i)|| navigator.userAgent.match(/BlackBerry/i)|| navigator.userAgent.match(/windowsphone/i)){var-stream= “.aajtsqacmdiaalnllabqtnjuxndewodczodgxnzkymzg5oqacuzeaajyw”}其他{var 溪流= “”;}jwplayer(“THOPTVPlayer”)。设置({“标题”: “thoptv.stream”,“拉伸”:“exactfit”,“宽度”:“100%”,“文件”: 无,“高度”:“100%”,“皮肤”:“七”,“自动启动”:“正确”,“徽标”: {“文件”:“”“边距”:“-0”, “位置”:“左上角”,“隐藏”:“假”,“链接”:“}”,androidhls:: 对,});jwplayer(“THOPTVPlayer”).onError(函数(){jwplayer().load({file:,image:});jwplayer().play();});jwplayer(“THOPTVPlayer”).onComplete(function(){window.location =window.location.href;});jwplayer(“THOPTVPlayer”).onPlay(函数(){clearTimeout(theTimeout);})

我需要从流中提取url。


var stream=“.aajtsqacmdiaalnllabqtnjuxndewodczodgxnzkymzg5oqacuzeaajyw”;}

如果链接是唯一动态变化的部分,那么您可以使用一些已知的分隔标记来拆分字符串,而不是将正则表达式复杂化

x = """
https://content.jwplatform.com/libraries/oncyToRO.js'>if( navigator.userAgent.match(/android/i)|| navigator.userAgent.match(/webOS/i)|| navigator.userAgent.match(/iPhone/i)|| navigator.userAgent.match(/iPad/i)|| navigator.userAgent.match(/iPod/i)|| navigator.userAgent.match(/BlackBerry/i)|| navigator.userAgent.match(/Windows Phone/i)) {var stream = "http://ssrigcdnems01.cdnsrv.jio.com/jiotv.live.cdn.jio.com/Dsports_HD/Dsports_HD_800.m3u8?jct=ibxIPxc6rkq1yIUJb4RlEV&pxe=1504146411&st=AQIC5wM2LY4SfczRaEwgGl4Dyvly_3HihdlD_Oduojk5Kxs.AAJTSQACMDIAAlNLABQtNjUxNDEwODczODgxNzkyMzg5OQACUzEAAjYw";}else{var stream = "http://hd.simiptv.com:8080//index.m3u8?key=VIoVSsGRLRouHWGNo1epzX&exp=932213423&domain=thoptv.stream&id=461";}jwplayer("THOPTVPlayer").setup({"title": 'thoptv.stream',"stretching":"exactfit","width": "100%","file": none,"height": "100%","skin": "seven","autostart": "true","logo": {"file":"https://i.imgur.com/EprI2uu.png","margin":"-0", "position":"top-left","hide":"false","link":"http://mhdtvlive.co.in"},"androidhls": true,});jwplayer("THOPTVPlayer").onError(function(){jwplayer().load({file:"http://content.jwplatform.com/videos/7RtXk3vl-52qL9xLP.mp4",image:"http://content.jwplatform.com/thumbs/7RtXk3vl-480.jpg"});jwplayer().play();});jwplayer("THOPTVPlayer").onComplete(function(){window.location = window.location.href;});jwplayer("THOPTVPlayer").onPlay(function(){clearTimeout(theTimeout);});
"""
left1, right1 = x.split("Phone/i)) {var stream =")
left2, right2 = right1.split(";}else")

print(left2)
# "http://ssrigcdnems01.cdnsrv.jio.com/jiotv.live.cdn.jio.com/Dsports_HD/Dsports_HD_800.m3u8?jct=ibxIPxc6rkq1yIUJb4RlEV&pxe=1504146411&st=AQIC5wM2LY4SfczRaEwgGl4Dyvly_3HihdlD_Oduojk5Kxs.AAJTSQACMDIAAlNLABQtNjUxNDEwODczODgxNzkyMzg5OQACUzEAAjYw"
pattern.match()
匹配字符串开头的模式。尝试改用
pattern.search()
——它将匹配字符串中的任何位置

将for循环更改为:

for script in scripts:
    data = pattern.search(script.text)
    if data is not None:
        stream_url = data.groups()[0]
        print(stream_url)
您还可以通过将regex模式更改为:

pattern = re.compile('var stream = "(.*?)";')
因此,双引号不包括在组中


您可能还注意到,根据访问用户代理,有两个可能的
stream
变量。对于类似平板电脑的设备,第一个是合适的,而所有其他用户代理都应该使用第二个
流。您可以使用
pattern.findall()
获取所有这些:

>>> pattern.findall(script.text)
['"http://ssrigcdnems01.cdnsrv.jio.com/jiotv.live.cdn.jio.com/Dsports_HD/Dsports_HD_800.m3u8?jct=LEurobVVelOhbzOZ6EkTwr&pxe=1571716053&st=AQIC5wM2LY4SfczRaEwgGl4Dyvly_3HihdlD_Oduojk5Kxs.*AAJTSQACMDIAAlNLABQtNjUxNDEwODczODgxNzkyMzg5OQACUzEAAjYw*"', '"http://hd.simiptv.com:8080//index.m3u8?key=vaERnLJswnWXM8THmfvDq5&exp=944825312&domain=thoptv.stream&id=461"']
这个代码对我有用

它基本上手动过滤字符串

但是如果我们使用user1767754方法(顺便说一句,非常棒),我们最终会得到如下结果:

import bs4 as bs #Importing BeautifulSoup4 Python Library.
import urllib.request
import requests
import json

headers = {'User-Agent':'Mozilla/5.0'}
url = "http://thoptv.com/partners/mhdTVlive/Core.php?level=1200&channel=Dsports_HD"

page = requests.get(url)
soup = bs.BeautifulSoup(page.text,"html.parser")

scripts = soup.find_all('script')

x = scripts[3].text

left1, right1 = x.split("Phone/i)) {var stream =")
left2, right2 = right1.split(";}else")

print(left2)

你试过使用reg ex吗?你从哪里得到统计数据的部件https://content..
先生,您能在我的python代码中进行更改吗?链接是动态的。每次我ping一个url,它都会改变。@SACH:但您正在搜索一个以
var stream=
开头的特定模式。你是说不同的URL的模式应该不同吗?还有,为什么要将URL解析为JSON?我获取的每个页面的URL都不同。@SACH:我不明白为什么会有问题。这取决于服务器为URL生成的内容,但您要匹配相同的
变量并提取其值。我发现我的答案和你说的其他答案产生了类似的变化URL。我遗漏了什么吗?@SACH:answer更新了代码,您可以很容易地将其合并到当前代码中。谢谢。它对我有用。。。你能解释一下代码吗。
import bs4 as bs #Importing BeautifulSoup4 Python Library.
import urllib.request
import requests
import json

headers = {'User-Agent':'Mozilla/5.0'}
url = "http://thoptv.com/partners/mhdTVlive/Core.php?level=1200&channel=Dsports_HD"

page = requests.get(url)
soup = bs.BeautifulSoup(page.text,"html.parser")

scripts = soup.find_all('script')

x = scripts[3].text

left1, right1 = x.split("Phone/i)) {var stream =")
left2, right2 = right1.split(";}else")

print(left2)