【问题标题】:How to scrape the javascript element by using requests and buetifulsoup如何使用 requests 和 beautifulsoup 抓取 javascript 元素
【发布时间】:2020-08-13 19:14:26
【问题描述】:

如何抓取元素(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)

【问题讨论】:

    标签: javascript python web-scraping beautifulsoup python-requests


    【解决方案1】:

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

    我使用demjson - https://github.com/dmeranda/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]]}]}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 2015-04-20
      • 2020-02-06
      • 1970-01-01
      相关资源
      最近更新 更多