为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

人到中年有点甜 2023-05-23 16:03:52
如何抓取元素 (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)
查看完整描述

1 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

问题是数据不是 json,它是一个 javascript 对象。即使您选择 json 并应用json.loads它也会失败。因此,您将需要可以将 javascript 对象转换为 json 的第 3 方库。

我使用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',

                    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]]}]}



查看完整回答
反对 回复 2023-05-23
  • 1 回答
  • 0 关注
  • 68 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信