【问题标题】:How to Extract Data from Graph from a web Page?如何从网页的图形中提取数据?
【发布时间】:2020-09-02 07:35:34
【问题描述】:

我正在尝试从网页中抓取图表数据:'https://cawp.rutgers.edu/women-percentage-2020-candidates'

我尝试使用以下代码从 Graph 中提取数据:

import requests
from bs4 import BeautifulSoup

Res = requests.get('https://cawp.rutgers.edu/women-percentage-2020-candidates').text
soup = BeautifulSoup(Res, "html.parser")

Values= [i.text for i in soup.findAll('g', {'class': 'igc-graph'}) if i]
Dates = [i.text for i in soup.findAll('g', {'class': 'igc-legend-entry'}) if i]

print(Values, Dates) ## both list are empty
Data= pd.DataFrame({'Value':Values,'Date':Dates}) ## Returning an Empty Dataframe

我想从所有 4 个条形图中提取日期和值。请任何人建议我在这里必须做什么来提取图形数据,或者是否有任何其他方法可以尝试提取数据。谢谢;

【问题讨论】:

    标签: python-3.x web-scraping beautifulsoup python-requests


    【解决方案1】:

    此图位于此网址:https://e.infogram.com/5bb50948-04b2-4113-82e6-5e5f06236538

    如果您查找类为infogram-embed 且属性值为data-id 的div,则可以直接在原始url 上找到信息图id(目标url 的路径):

    <div class="infogram-embed" data-id="5bb50948-04b2-4113-82e6-5e5f06236538" data-title="Candidate Tracker 2020_US House_Proportions" data-type="interactive"> </div>
    

    从这个 url,它在 javascript 中加载一个静态 JSON。您可以使用正则表达式将其提取并解析 JSON 结构以获取行/列以及不同的表:

    import requests
    from bs4 import BeautifulSoup
    import re
    import json
    
    original_url = "https://cawp.rutgers.edu/women-percentage-2020-candidates"
    r = requests.get(original_url)
    soup = BeautifulSoup(r.text, "html.parser")
    
    infogram_url = f'https://e.infogram.com/{soup.find("div",{"class":"infogram-embed"})["data-id"]}'
    r = requests.get(infogram_url)
    soup = BeautifulSoup(r.text, "html.parser")
    
    script = [
        t 
        for t in soup.findAll("script") 
        if "window.infographicData" in t.text
    ][0].text
    
    extract = re.search(r".*window\.infographicData=(.*);$", script)
    
    data = json.loads(extract.group(1))
    
    entities = data["elements"]["content"]["content"]["entities"]
    
    tables = [
        (entities[key]["props"]["chartData"]["sheetnames"], entities[key]["props"]["chartData"]["data"])
        for key in entities.keys()
        if ("props" in entities[key]) and ("chartData" in entities[key]["props"])
    ]
    
    data = []
    for t in tables:
        for i, sheet in enumerate(t[0]):
            data.append({
                "sheetName": sheet,
                "table": dict([(t[1][i][0][j],t[1][i][1][j])  for j in range(len(t[1][i][0])) ])
            })
    print(data)
    

    输出:

    [{'sheetName': 'Sheet 1',
      'table': {'': '2020', 'Districts Already Filed': '435'}},
     {'sheetName': 'All',
      'table': {'': 'Filed', '2016': '17.8%', '2018': '24.2%', '2020': '29.1%'}},
     {'sheetName': 'Democrats Only',
      'table': {'': 'Filed', '2016': '25.1%', '2018': '32.5%', '2020': '37.9%'}},
     {'sheetName': 'Republicans Only',
      'table': {'': 'Filed', '2016': '11.5%', '2018': '13.7%', '2020': '21.3%'}}]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      相关资源
      最近更新 更多