使用BeautifulSoup4 Python从javascript源代码中提取变量值
我是python编程的新手。我正在学习beautifulsoup废弃网站 我想提取“stream”的值并将其存储到我的变量中 我的Python代码如下所示:使用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:
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)