Dataframe 通过外部软件创建Web抓取嵌入式表

Dataframe 通过外部软件创建Web抓取嵌入式表,dataframe,web-scraping,extract,embedded-resource,Dataframe,Web Scraping,Extract,Embedded Resource,我目前正试图从这个网页上的“查找您的学区缺少互联网”表中提取所有条目。该表是在Datawrapper(一个可视化平台)中创建的,所以JavaScript黑客似乎不起作用 任何关于我如何继续的想法都将不胜感激。对提取的数据进行适当的格式设置不是必要的,但是一种循环浏览1332页的方法会更好。谢谢 使用标记从网站上可用的链接中删除了用于嵌入的表 首先查找script标记,该标记包含学校的JSON 在表中呈现的数据 然后查找确切的数据JSON“chartData”,以清理和处理数据,因为它是一个长字符

我目前正试图从这个网页上的“查找您的学区缺少互联网”表中提取所有条目。该表是在Datawrapper(一个可视化平台)中创建的,所以JavaScript黑客似乎不起作用


任何关于我如何继续的想法都将不胜感激。对提取的数据进行适当的格式设置不是必要的,但是一种循环浏览1332页的方法会更好。谢谢

使用
标记从网站上可用的链接中删除了用于嵌入的表

  • 首先查找
    script
    标记,该标记包含学校的JSON 在表中呈现的数据
  • 然后查找确切的数据JSONchartData”,以清理和处理数据,因为它是一个长字符串
  • 拆分存在
    \r
    回车符的字符串
  • \n
    新行替换为字符串中的空白
  • 最后将与学校相关的数据保存在.csv文件中
  • 在运行脚本之前,请务必在file_path变量中提及系统路径

    有13315条记录被提取并转储到文件中。下面是一个示例数据屏幕截图。

    这太棒了,非常感谢您的帮助!就这么做了!再次感谢:)
    import json
    import requests
    from urllib3.exceptions import InsecureRequestWarning
    requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
    from bs4 import BeautifulSoup as bs
    import csv
    import re
    
    def scrape_table_data():
    
    list_of_schools = []
    file_path = ''#mention your system path where you have to save the file
    file_name = 'schools_list.csv'
    url = 'https://datawrapper.dwcdn.net/FJJmb/2/'
    
    page = requests.get(url,verify=False)
    soup = bs(page.text, 'lxml')
    data = soup.find_all('script', type='text/javascript',charset="utf-8")[5].text
    txt = re.findall(r'chartData\s*:\s*(".*")', data)
    sanitize_string = txt[0].split(r'\r')
    
    csv_headers = ['#','School District','Pct. No internet','Pct. with internet','Pct. No computers']
    
    for idx, school_data in enumerate(sanitize_string):
        if idx > 0:
            stripped_data = school_data.replace(r'\n', '').replace('\\', '').split(',')
            list_of_schools.append({
                                    '#':idx,
                                    'School District':stripped_data[0] + ',' + stripped_data[1],
                                    'Pct. No internet': stripped_data[2],
                                    'Pct. with internet': stripped_data[3],
                                    'Pct. No computers': stripped_data[4]
                                    })
           
    with open(file_path + file_name ,'a+') as schools_CSV:
        csvwriter = csv.DictWriter(schools_CSV, delimiter=',', lineterminator='\n',fieldnames=csv_headers)
    
        print('Writing CSV header now...')
        csvwriter.writeheader()
    
        #iterate over the list and save the data in file
        for item in list_of_schools:
            print('Writing data rows now..')
            print(item)            
            csvwriter.writerow(item)
    
    scrape_table_data()