Parsing 如何将动态图形中的数据点提取到文本文件中?(Datawrapper/html/json)

Parsing 如何将动态图形中的数据点提取到文本文件中?(Datawrapper/html/json),parsing,text,graph,extract,Parsing,Text,Graph,Extract,我想提取链接图(datawrapper)文本文件中的点,当您将光标移动到不同的绘制线(不同的日期、不同的比例)上时,会显示这些点 (查看带有“查看源代码:”的代码) 到目前为止,我只提取了单个表,例如,在简单HTML页面上使用BeautifulSoup或in R。在这种情况下,我不知道最优雅的方法是什么 我可以深入探讨解决这个问题的常见方法或解决方案是什么?因为我想提取一些类似于表的图,所以需要一个自动化的解决方案 谢谢你的建议我有点晚了,但我希望这可能会有所帮助。图形是由javascript生

我想提取链接图(datawrapper)文本文件中的点,当您将光标移动到不同的绘制线(不同的日期、不同的比例)上时,会显示这些点

(查看带有“查看源代码:”的代码)

到目前为止,我只提取了单个表,例如,在简单HTML页面上使用BeautifulSoup或in R。在这种情况下,我不知道最优雅的方法是什么

我可以深入探讨解决这个问题的常见方法或解决方案是什么?因为我想提取一些类似于表的图,所以需要一个自动化的解决方案


谢谢你的建议

我有点晚了,但我希望这可能会有所帮助。图形是由javascript生成的——我们可以深入研究脚本,找到它们使用的JSON格式的数据

我是如何解决这个问题的,使用python:

  • 使用
    beautifulsou
    解析网页:
  • 找到包含我们需要的所有数据的脚本,并删除一些不必要的字符:
  • 嵌套在这个混乱字符串中的是包含数据的JSON。因此,我们可以使用正则表达式查找并提取它:
  • 这在技术上仍然是字符串形式,因此我们需要使用
    json
    库解析它:
  • 现在,您应该拥有所有数据,这样您就可以查看它,找到您想要的任何片段,并将其转换为数据帧(
    pandas.dataframe.from_records()
    非常有用)


    完整代码:

    import requests
    import re
    import json
    from bs4 import BeautifulSoup as bs
    
    url = "https://datawrapper.dwcdn.net/RE9Rq/1/"
    raw = requests.get(url)
    soup = bs(raw.text, "lxml")
    raw_data = soup.find_all("script")[1]
    string_data = str(string_data).replace("\\", "")
    raw_json = (
        "{" + re.findall(r"\"data\":\{.*?\]", raw_data, flags=re.MULTILINE)[1] + "}}"
    )
    
    data = json.loads(raw_json)["data"]
    
    raw_data = soup.find_all("script")[1]
    string_data = str(raw_data).replace("\\", "")
    
    raw_json = (
        "{" + re.findall(r"\"data\":\{.*?\]", string_data, flags=re.MULTILINE)[1] + "}}"
    )
    
    data = json.loads(raw_json)["data"]
    
    import requests
    import re
    import json
    from bs4 import BeautifulSoup as bs
    
    url = "https://datawrapper.dwcdn.net/RE9Rq/1/"
    raw = requests.get(url)
    soup = bs(raw.text, "lxml")
    raw_data = soup.find_all("script")[1]
    string_data = str(string_data).replace("\\", "")
    raw_json = (
        "{" + re.findall(r"\"data\":\{.*?\]", raw_data, flags=re.MULTILINE)[1] + "}}"
    )
    
    data = json.loads(raw_json)["data"]