[PYTHON] Data Langling (pdfplumber) PDF über den Ausbruch der Influenza durch das Ministerium für Gesundheit, Arbeit und Soziales

Erstellt PDF-Daten über die Influenza-Ausbruchsituation des Ministeriums für Gesundheit, Arbeit und Soziales mit pdfplumber

Dies ist einfach, da Sie die Position des Charakters mit Zeichen überprüfen und den Erntebereich festlegen können.

with pdfplumber.open("data.pdf") as pdf:

    p1 = pdf.pages[1]

    #Überprüfen Sie die Position des Textes
    p1.chars

    #Holen Sie sich Text mit Zuschneiden
    week_crop = p1.within_bbox((0, 90, p1.width, 105))
    s = week_crop.extract_text()

Programm

import csv
import datetime
import pathlib
import re
from urllib.parse import urljoin

import pdfplumber
import pandas as pd
import requests
from bs4 import BeautifulSoup

def fetch_file(url, dir="."):

    r = requests.get(url)
    r.raise_for_status()

    p = pathlib.Path(dir, pathlib.PurePath(url).name)
    p.parent.mkdir(parents=True, exist_ok=True)

    with p.open(mode="wb") as fw:
        fw.write(r.content)
    return p

url = "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kenkou_iryou/kenkou/kekkaku-kansenshou01/houdou_00008.html"

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
}

r = requests.get(url, headers=headers)
r.raise_for_status()

soup = BeautifulSoup(r.content, "html.parser")

d1 = []
d2 = []

for i in soup.select('ul.m-listLink > li > a[href$=".pdf"]')[::-1]:

    text = i.get_text(strip=True)

    t = re.match("(\d{4})Jahr(\d{1,2})Mond(\d{1,2})Tag", text)

    #Datum der Pressemitteilung

    if t:
        year, month, day = map(int, t.groups())
        dt_date = datetime.date(year, month, day)
    else:
        dt_date = datetime.date.today()

    #PDF Datei

    link = urljoin(url, i.get("href"))

    p = fetch_file(link)

    with pdfplumber.open(p) as pdf:

        p1 = pdf.pages[1]

        #Holen Sie sich Text mit Zuschneiden
        week_crop = p1.within_bbox((0, 90, p1.width, 105))
        s = week_crop.extract_text()

        m = re.search("(\d{4})Jahr(\d{1,2})Woche\((\d{1,2})Mond(\d{1,2})So ~(\d{1,2})Mond(\d{1,2})Tag\)", s)

        if m:
            s_year, s_week, s_month, s_day, e_month, e_day = map(int, m.groups())

            dt_start = datetime.date(s_year, s_month, s_day)
            dt_end = datetime.date(s_year, e_month, e_day)

            if dt_start > dt_end:
                dt_end = datetime.date(s_year + 1, e_month, e_day)

            table = p1.extract_table()

            df_tmp = pd.DataFrame(
                table[2:], columns=["Präfekturen", "Anzahl der Berichte", "Pro Fixpunkt"]
            ).set_index("Präfekturen")

            df_tmp.index = df_tmp.index.map(lambda s: "".join(s.split()))

            df_tmp = df_tmp.mask(df_tmp == "-")
            df_tmp["Anzahl der Berichte"] = df_tmp["Anzahl der Berichte"].str.replace(",", "").astype(float).astype("Int64")
            df_tmp["Pro Fixpunkt"] = df_tmp["Pro Fixpunkt"].astype(float)

            df_tmp.loc["Jahr"] = s_year
            df_tmp.loc["Woche"] = s_week
            df_tmp.loc["Anfangsdatum"] = dt_start
            df_tmp.loc["Endtermin"] = dt_end

            s1 = df_tmp["Anzahl der Berichte"]
            s1.name = dt_date
            d1.append(s1)

            s2 = df_tmp["Pro Fixpunkt"]
            s2.name = dt_date
            d2.append(s2)

df1 = pd.concat(d1, axis=1, sort=False).T.astype({"Jahr": int, "Woche": int})
df2 = pd.concat(d2, axis=1, sort=False).T.astype({"Jahr": int, "Woche": int})

df3 = df1.join(df2, rsuffix="(Pro Fixpunkt)")

df = df3.reindex(
    columns=[
        "Jahr",
        "Woche",
        "Anfangsdatum",
        "Endtermin",
        "Hokkaido",
        "Hokkaido (pro Fixpunkt)",
        "Präfektur Aomori",
        "Präfektur Aomori (pro Fixpunkt)",
        "Präfektur Iwate",
        "Präfektur Iwate (pro Festpunkt)",
        "Präfektur Miyagi",
        "Präfektur Miyagi (pro Festpunkt)",
        "Akita",
        "Präfektur Akita (pro Fixpunkt)",
        "Präfektur Yamagata",
        "Präfektur Yamagata (pro Festpunkt)",
        "Präfektur Fukushima",
        "Präfektur Fukushima (pro Festpunkt)",
        "Präfektur Ibaraki",
        "Präfektur Ibaraki (pro Festpunkt)",
        "Präfektur Tochigi",
        "Präfektur Tochigi (pro Festpunkt)",
        "Präfektur Gunma",
        "Präfektur Gunma (pro Festpunkt)",
        "Saitama",
        "Präfektur Saitama (pro Festpunkt)",
        "Präfektur Chiba",
        "Präfektur Chiba (pro Festpunkt)",
        "Tokio",
        "Tokio (pro Festpunkt)",
        "Präfektur Kanagawa",
        "Präfektur Kanagawa (pro Festpunkt)",
        "Präfektur Niigata",
        "Präfektur Niigata (pro Festpunkt)",
        "Präfektur Toyama",
        "Präfektur Toyama (pro Festpunkt)",
        "Präfektur Ishikawa",
        "Präfektur Ishikawa (pro Festpunkt)",
        "Präfektur Fukui",
        "Präfektur Fukui (pro Festpunkt)",
        "Präfektur Yamanashi",
        "Präfektur Yamanashi (pro Fixpunkt)",
        "Präfektur Nagano",
        "Präfektur Nagano (pro Festpunkt)",
        "Präfektur Gifu",
        "Präfektur Gifu (pro Festpunkt)",
        "Präfektur Shizuoka",
        "Präfektur Shizuoka (pro Fixpunkt)",
        "Präfektur Aichi",
        "Präfektur Aichi (pro Festpunkt)",
        "Präfektur Mie",
        "Präfektur Mie (pro Festpunkt)",
        "Präfektur Shiga",
        "Präfektur Shiga (pro Festpunkt)",
        "Kyoto",
        "Kyoto (pro Festpunkt)",
        "Präfektur Osaka",
        "Osaka (pro Fixpunkt)",
        "Präfektur Hyogo",
        "Präfektur Hyogo (pro Festpunkt)",
        "Präfektur Nara",
        "Präfektur Nara (pro Festpunkt)",
        "Präfektur Wakayama",
        "Präfektur Wakayama (pro Festpunkt)",
        "Präfektur Tottori",
        "Präfektur Tottori (pro Festpunkt)",
        "Präfektur Shimane",
        "Präfektur Shimane (pro Festpunkt)",
        "Präfektur Okayama",
        "Präfektur Okayama (pro Festpunkt)",
        "Präfektur Hiroshima",
        "Präfektur Hiroshima (pro Festpunkt)",
        "Präfektur Yamaguchi",
        "Präfektur Yamaguchi (pro Festpunkt)",
        "Präfektur Tokushima",
        "Präfektur Tokushima (pro Festpunkt)",
        "Präfektur Kagawa",
        "Präfektur Kagawa (pro Festpunkt)",
        "Präfektur Ehime",
        "Präfektur Ehime (pro Festpunkt)",
        "Präfektur Kochi",
        "Präfektur Kochi (pro Fixpunkt)",
        "Präfektur Fukuoka",
        "Präfektur Fukuoka (pro Festpunkt)",
        "Präfektur Saga",
        "Präfektur Saga (pro Festpunkt)",
        "Präfektur Nagasaki",
        "Präfektur Nagasaki (pro Festpunkt)",
        "Präfektur Kumamoto",
        "Präfektur Kumamoto (pro Festpunkt)",
        "Präfektur Oita",
        "Präfektur Oita (pro Festpunkt)",
        "Präfektur Miyazaki",
        "Präfektur Miyazaki (pro Fixpunkt)",
        "Präfektur Kagoshima",
        "Präfektur Kagoshima (pro Festpunkt)",
        "Präfektur Okinawa",
        "Präfektur Okinawa (pro Festpunkt)",
        "Gesamtzahl",
        "Gesamtzahl (pro Festpunkt)",
        "Letztes Jahr synchronisiert (insgesamt)",
        "Letztes Jahr synchronisiert (Gesamtzahl) (pro Fixpunkt)",
    ]
)

df1.to_csv(
    "influ_count.csv", index=False, quoting=csv.QUOTE_NONNUMERIC, encoding="utf_8_sig",
)

df2.to_csv(
    "influ_point.csv", index=False, quoting=csv.QUOTE_NONNUMERIC, encoding="utf_8_sig",
)

df.to_csv(
    "influ_all.csv", index=False, quoting=csv.QUOTE_NONNUMERIC, encoding="utf_8_sig", na_rep="-",
)

Recommended Posts

Data Langling (pdfplumber) PDF über den Ausbruch der Influenza durch das Ministerium für Gesundheit, Arbeit und Soziales
Daten Langling PDF über den Ausbruch der Influenza durch das Ministerium für Gesundheit, Arbeit und Soziales
Datenbereinigung offener Daten zur Ereignissituation des Ministeriums für Gesundheit, Arbeit und Soziales
PDF-Kratzer über den Status testpositiver Personen in jeder Präfektur des Ministeriums für Gesundheit, Arbeit und Soziales
PDF-Datei mit der nationalen Liste der Mindestlöhne nach Regionen des Ministeriums für Gesundheit, Arbeit und Soziales
[Python] Lesen Sie automatisch Informationen der Präfektur des neuen Koronavirus aus dem PDF des Ministeriums für Gesundheit, Arbeit und Soziales und schreiben Sie sie in eine Tabelle oder in Excel.
Geschichte der Bildanalyse von PDF-Dateien und Datenextraktion