【问题标题】:How to scrape elements from a HTML Dygraph?如何从 HTML Dygraph 中抓取元素?
【发布时间】:2021-03-25 17:28:21
【问题描述】:

我正在尝试使用 BeautifulSoup 和 Python 中的请求从该网站 https://bitinfocharts.com/comparison/bitcoin-transactions.html 获取所有数据点。到目前为止,我有代码:

session = requests.Session()
page = session.get(https://bitinfocharts.com/comparison/bitcoin-transactions.html)
soup = BeautifulSoup(page.content, 'html.parser')
values = soup.find_all('script')[4]

这将返回所有数据点所在的 html 代码部分,但数据点是 Dygraph 的一部分,我不知道如何获取它们。我也试过了

values = soup.find_all('script')[4].get_text()

但这根本不会返回任何东西。

d = new Dygraph(document.getElementById("container"),[[new Date("2009/01/03"),null],[new Date("2009/01/04"),null],
[new Date("2009/01/05"),null],[new Date("2009/01/06"),null],[new Date("2009/01/07"),null],
[new Date("2009/01/08"),null],[new Date("2009/01/09"),null],[new Date("2009/01/10"),null],
[new Date("2009/01/11"),null],[new Date("2009/01/12"),7]........etc

在网站代码上,数据看起来像这样,但我不熟悉这意味着什么以及如何获取这些数据。我不知道数据集开头和结尾的双括号代表什么。

【问题讨论】:

    标签: python html beautifulsoup python-requests dygraphs


    【解决方案1】:

    不明白问题

    import requests
    from bs4 import BeautifulSoup
    
    data = dict()
    session = requests.Session()
    page = session.get('https://bitinfocharts.com/comparison/bitcoin-transactions.html')
    soup = BeautifulSoup(page.content, 'html.parser')
    values = str(soup.find_all('script')[4])
    values = values.split('d = new Dygraph(document.getElementById("container"),')[1].split(', {labels: ')[0]
    for i in range(values.count('new Date')):
        date = values.split('new Date("')[i+1].split('"')[0]
        value = values.split('"),')[i+1].split(']')[0]
        print(date, value)
    

    这个?

    【讨论】:

      【解决方案2】:

      关键是把数据从脚本中拉出来。不知道下面这个方法是不是你想要的。

      from simplified_scrapy import utils, SimplifiedDoc, req
      html = req.get(
          'https://bitinfocharts.com/comparison/bitcoin-transactions.html')
      
      doc = SimplifiedDoc(html)
      js = doc.getElementByText('new Dygraph', tag='script').html
      js = js[js.find('document.getElementById("container"),') +
              len('document.getElementById("container"),'):]
      js = js[:js.find(', {labels:')] # Get data part
      js = js.replace('[new Date("', '').replace('")', '')[1:-2]
      data = [kv.split(',') for kv in js.split('],')]
      print(data)
      

      结果:

      [['2009/01/03', 'null'], ['2009/01/04', 'null'], ['2009/01/05', 'null'], ['2009/01/06', 'null'], ['2009/01/07', 'null'], ['2009/01/08', 'null'], ['2009/01/09', 'null'], ...
      

      【讨论】:

        猜你喜欢
        • 2015-07-15
        • 1970-01-01
        • 2021-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多