如果您以后想处理这些数据,我认为pandas dataframe 在这里会做得最好。
这是我的看法:
from datetime import datetime
import pandas as pd
import requests
from bs4 import BeautifulSoup
from tabulate import tabulate
response = requests.get("https://dumps.wikimedia.org/enwiki/latest/").text
soup = BeautifulSoup(response, "html.parser")
all_urls = [
f"https://dumps.wikimedia.org/enwiki/latest/{a['href']}" for a
in soup.find_all("a") if a.text != "../"
]
def get_lines(bs4_soup):
for index, line in enumerate(bs4_soup.getText().split('\n')[4:]):
if line:
_, *date_and_time, size = line.strip().split()
yield [
all_urls[index],
parse_date(date_and_time),
human_readable_size(int(size))
]
def human_readable_size(size, decimal_places=2):
for unit in ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB']:
if size < 1024.0 or unit == 'PiB':
break
size /= 1024.0
return f"{size:.{decimal_places}f} {unit}"
def parse_date(date):
return datetime.strptime(' '.join(date), "%d-%b-%Y %H:%M")
lines = [line for line in get_lines(soup)]
columns = ["URL", "DATE AND TIME", "SIZE"]
df = pd.DataFrame(lines, columns=columns)
df.to_csv("wiki_dump.csv", index=False)
print(tabulate(df[:10], showindex=False, headers=columns))
输出(沿 .csv 文件):
URL DATE AND TIME SIZE
--------------------------------------------------------------------------------- ------------------- ----------
https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-abstract.xml.gz 2020-09-23 08:25:00 744.28 MiB
https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-abstract.xml.gz-rss.xml 2020-09-23 08:25:00 760.00 B
https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-abstract1.xml.gz 2020-09-22 23:28:00 107.15 MiB
https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-abstract1.xml.gz-rss.xml 2020-09-23 08:24:00 763.00 B
https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-abstract10.xml.gz 2020-09-23 04:14:00 26.75 MiB
https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-abstract10.xml.gz-rss.xml 2020-09-23 08:24:00 766.00 B
https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-abstract11.xml.gz 2020-09-23 03:32:00 25.00 MiB
https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-abstract11.xml.gz-rss.xml 2020-09-23 08:24:00 766.00 B
https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-abstract12.xml.gz 2020-09-23 03:59:00 23.40 MiB
https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-abstract12.xml.gz-rss.xml 2020-09-23 08:24:00 766.00 B
and so on...