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

如何抓取元素 (series: ~~~~ until ~~~~ data: [[90, 63000],[91, 68000]]}] 并将其转换为 dict 或 list 类型?


这是网站中的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',

                    data: [[90, 47000],[91, 53000]]

                  },{

                    

                    name: 'Tonic',

                    data: [[90, 63000],[91, 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)


人到中年有点甜
浏览 102回答 1
1回答

千万里不及你

问题是数据不是 json,它是一个 javascript 对象。即使您选择 json 并应用json.loads它也会失败。因此,您将需要可以将 javascript 对象转换为 json 的第 3 方库。我使用demjson- from bs4 import BeautifulSoupimport demjsonhtml = """<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',                    data: [[90, 47000],[91, 53000]]                  },{                                        name: 'Tonic',                    data: [[90, 63000],[91, 68000]]                  }]                });                                            });                        </script>"""script = soup.find("script").text.strip()data = demjson.decode(script[script.index("{"):script.index("});")] + "}")print(type(data))print("-" * 10)print(data)输出:<class 'dict'>----------{'series': [{'name': 'Water', 'data': [[90, 50000], [91, 53000]]}, {'name': 'Tea', 'data': [[90, 47000], [91, 53000]]}, {'name': 'Tonic', 'data': [[90, 63000], [91, 68000]]}]}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python