问题描述
如何抓取元素(系列:~~~~直到~~~~数据:[[90,63000],[91,68000]]}]]并将其转换为字典或列表类型?
这是网站中的javascript:
<script type="text/javascript">
var chart;
var screenWidth = window.innerWidth * 0.935 * 1;
$(document).ready(function() {
series: [{
name: 'Water',data: [[90,50000],[91,53000]]
},{
name: 'Tea',47000],{
name: 'Tonic',63000],68000]]
}]
});
});
</script>
s=requests.get(url,params = data,headers)
data= BeautifulSoup(s.text,'lxml')
jsons= data.find_all('script')[1].text
datas= jsons.find('series:')
last= jsons.find(']]')
new=''
for x in range(datas+6,last+2):
new+=jsons[x]
newdata = eval(new)
解决方法
问题在于数据不是json,而是javascript对象。即使您选择json并应用main
,它也会失败。因此,您将需要可以将javascript对象转换为json的第三方库。
我使用json.loads
-https://github.com/dmeranda/demjson
demjson
输出:
from bs4 import BeautifulSoup
import demjson
html = """<script type="text/javascript">
var chart;
var screenWidth = window.innerWidth * 0.935 * 1;
$(document).ready(function() {
series: [{
name: 'Water',data: [[90,50000],[91,53000]]
},{
name: 'Tea',47000],{
name: 'Tonic',63000],68000]]
}]
});
});
</script>"""
script = soup.find("script").text.strip()
data = demjson.decode(script[script.index("{"):script.index("});")] + "}")
print(type(data))
print("-" * 10)
print(data)