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