如何使用请求和buetifulsoup抓取javascript元素

问题描述

如何抓取元素(系列:~~~~直到~~~~数据:[[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>

这是我的错误python代码

    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)