我需要从此链接中抓取数据:https://flo.uri.sh/visualization/15396850/embed?auto=1
这是我的Python代码:
import pandas as pd
import html.parser
import requests
import urllib.request
from selenium import webdriver
base_url = "https://flo.uri.sh/visualisation/15396850/embed?auto=1"
class MyParser(html.parser.HTMLParser):
def __init__(self, html):
self.matches = []
self.match_count = 0
super().__init__()
def handle_data(self, data):
self.matches.append(data)
self.match_count += 1
def handle_starttag(self, tag, attrs):
attrs = dict(attrs)
if tag == "div":
if attrs.get("fl-layout-primary-container"):
self.handle_data()
else: return
url = base_url.format(page_number)
driver = webdriver.Chrome()
driver.get(url)
html = driver.page_source
parser = MyParser(html)
parser.feed(html)
for item in parser.matches:
print(item)
我得到的输出包含表的元数据。我一直无法弄清楚如何将其转换为 csv 表。
这就是我的输出。
您要查找的数据以 Json 形式嵌入 HTML 页面中。要将它们保存到 pandas 数据框,请将其保存为 CSV,您可以使用下一个示例:
import json
import re
import pandas as pd
import requests
url = "https://flo.uri.sh/visualisation/15396850/embed?auto=1"
html_source = requests.get(url).text
column_names = json.loads(
re.search(r"_Flourish_data_column_names = (.*})", html_source).group(1)
)
data = json.loads(re.search(r"_Flourish_data = (.*})", html_source).group(1))
all_data = []
for r in data["rows"]:
all_data.append(r["columns"])
df = pd.DataFrame(all_data, columns=column_names["rows"]["columns"])
print(df.to_csv("data.csv", index=False))
保存
data.csv
(LibreOffice 的屏幕截图):