[PYTHON] Lassen Sie sie den Aozora Bunko langsam lesen: Codeverbesserung

Letztes Mal konnte vorgelesen werden, während langsam im Wörterbuch (SofTalk) registriert wurde. Dieses Mal werde ich den vorherigen Code verbessern, während ich die offizielle Dokumentation und verwandte Artikel zum Lernen lese.

Von der Buchkarte bis zur URL-Erfassung

Verbesserter Code

aozora_urlsplit.py


import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin

def aozoraurl(base_url):
    page = requests.get(base_url)
    soup = BeautifulSoup(page.text, 'lxml')

    xhtml_relative_url = soup.select('table.download a[href*=".html"]')[0].get('href')
    zipdl_relative_url = soup.select('table.download a[href*=".zip"]')[0].get('href')

    xhtml_url = urljoin(base_url, xhtml_relative_url)
    zipdl_url = urljoin(base_url, zipdl_relative_url)

    return xhtml_url, zipdl_url

if __name__ == '__main__':
    print(aozoraurl("https://www.aozora.gr.jp/cards/000879/card85.html"))

Beautiful Soup 4

** Beautiful Soup ist eine Python-Bibliothek, die Daten aus HTML- und XML-Dateien abruft. ** ** ** Aus Beautiful Soup 4.2.0 Doc. Japanische Übersetzung

Analysieren Sie die Struktur, indem Sie ein HTML-Dokument an den Konstruktor "BeautifulSoup" übergeben

from bs4 import BeautifulSoup
soup = BeautifulSoup(page.content, 'lxml')

'lxml' gibt einen Parser an (Syntaxanalysator) Sie können den HTML-Parser aus dem Python-Standard (einschließlich Batterien) "html", "Parser", "fast" lxml "und" html5lib "auswählen. Die offizielle Dokumentation scheint "lxml" zu empfehlen

If you can, I recommend you install and use lxml for speed. Aus Beautiful Soup 4.9.0-Dokumentation

Requests

** Requests ist eine Apache2-lizenzierte HTTP-Bibliothek, die in Python geschrieben wurde und benutzerfreundlich gestaltet ist. ** ** ** Von Anfragen: HTTP für Menschen

Wenn Sie die URL an "request.get ()" übergeben, wird ein "Response" -Objekt zurückgegeben Sie können ".text" und ".content" verwenden, um den Inhalt von "Response" abzurufen

Aus dem offiziellen Dokument


import requests
r = request.get(URL)
r.content #Holen Sie sich binäre Daten
r.text    #Textdaten abrufen

Ich kenne den Unterschied zwischen Binär und Text nicht, aber laut [^ stack] ist es hier ".text" für HTML und XML und ".content" für Bilder und PDF.

Holen Sie sich 2 Arten von URL (XHTML / zip)

Es gibt verschiedene Möglichkeiten, um Elemente abzurufen, aber ich denke, der CSS-Selektor ist der vielseitigste.

If you want to search for tags that match two or more CSS classes, you should use a CSS selector:

Aus dem offiziellen Dokument


css_soup.select("p.strikeout.body") 
# [<p class="body strikeout"></p>]

Extrahieren Sie jede URL von der Seite der Aozora Bunko Book Card Beachten Sie, dass der Rückgabewert von "oup.select "eine Liste ist

xhtml_url = soup.select('table.download a[href*=".html"]')[0].get('href')
zip_url   = soup.select('table.download a[href*=".zip"]')[0].get('href')

urljoin

Links von den Seiten der Aozora Bunko-Buchkarte zu jeder Seite werden als relative Links aufgeführt. Verwenden Sie "urljoin", um mit der ursprünglichen URL zu synthetisieren und zu einem absoluten Link zurückzukehren

urllib.parse.urljoin(base, url, allow_fragments=True) ** Kombinieren Sie die "Basis-URL" (Basis) mit einer anderen URL (URL), um eine vollständige URL ("absolute URL") zu bilden. ** ** ** Von urllib.parse --- URL in Komponente analysieren

Aus dem offiziellen Dokument


>>> from urllib.parse import urljoin
>>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', 'FAQ.html')
'http://www.cwi.nl/%7Eguido/FAQ.html'

return a, b

Wenn Sie mehrere Rückgabewerte zurückgeben möchten (diesmal zwei URLs), scheint es am einfachsten zu sein, so zu schreiben

In Python können Sie alle Zeichenfolgen und Zahlen zurückgeben, indem Sie sie einfach durch Kommas getrennt zurückgeben. Aus So geben Sie mehrere Rückgabewerte mit einer Python-Funktion zurück | note.nkmk.me

In diesem Fall ist der Rückgabewert ein Taple.

Aus der Rubinextraktion von der XHTML-Seite

Verbesserter Code

aozora_rubylist.py


from bs4 import BeautifulSoup
import requests
import jaconv

def aozoraruby(xhtml_url):
    page = requests.get(xhtml_url)
    soup = BeautifulSoup(page.content, 'lxml')

    _ruby = soup.select("ruby")

    _rubylist = [i.get_text().replace(")", "").split("(") for i in _ruby]

    for index, item in enumerate(_rubylist):
        _rubylist[index][1] = jaconv.kata2hira(item[1])
    
    return _rubylist

if __name__ == '__main__':
    print(aozoraruby("https://www.aozora.gr.jp/cards/000119/files/624_14544.html"))

Rubi-Extraktion

Extrahieren Sie die Zeichen unter dem Ruby-Tag aus dem XozML-Körper von Aozora Bunko Ich denke, ".select (" ruby ")" ist am einfachsten

Überprüfen Sie vorerst den erfassten Inhalt Sie können den Zeichenfolgenteil mit .get_text () extrahieren, er kann jedoch nicht auf die Liste angewendet werden. Drehen Sie ihn daher mit der for-Anweisung.

_ruby = soup.select("ruby")
for i in _ruby:
    print(i.get_text())

#Schwer
#Toter Körper
#Mariya
# ︙

Es wird in Form von "Kanji (Rubin)" ausgegeben

Erstellen einer Rubinliste

Listen Sie den erworbenen Rubin auf. Es ist schwierig, in einer Liste von einfachen "[" Kanji "," Kanji ", ...]" zu verwenden, also "[[" Kanji "," Yomigana "], [" Kanji "," Yomigana " ], ...] `Erstellen Sie ein zweidimensionales Array

Beim Erstellen einer Liste mit einer for-Anweisung haben Sie vor der for-Anweisung eine leere Liste erstellt und Elemente hinzugefügt. Es scheint jedoch, dass es in einem Satz unter Verwendung der Methode ** Listeneinschlussnotation ** [^ naihou1] [^ naihou2] erstellt werden kann.

x = [i.get_text().replace(")", "").split("(") for i in _ruby]
# [['Schwer', 'Regenschirm'], ['Toter Körper', 'Herausfordernd'], ['Mariya', 'Maria'],...]

Katata nach Hiragana

Um sich im Wörterbuch in SofTalk zu registrieren, wird das Lesepseudonym in Hiragana umgewandelt. Laut diesem Qiita-Artikel scheint jaconv für diese Verwendung geeignet zu sein.

jaconv (japanischer Konverter) führt eine Hochgeschwindigkeitskonvertierung von Zeichentypen aus Hiragana, Katakana, voller Breite und halber Breite durch. Da es nur in Python implementiert ist, kann es auch in einer Umgebung verwendet werden, in der der C-Compiler nicht verwendet werden kann. Von jaconv / README_JP.rst bei master · ikegami-yukino / jaconv · GitHub

for index, item in enumerate(_rubylist):
    _rubylist[index][1] = jaconv.kata2hira(item[1])
# [['Schwer', 'Regenschirm'], ['Toter Körper', 'Herausfordernd'], ['Mariya', 'Mariya'],...]

[^ naihou1]: Schreiben Sie die Listenerstellung präzise mit der Einschlussnotation --Qiita https://qiita.com/tag1216/items/040e482f9844805bce7f

[^ naihou2]: Verwendung der Listeneinschlussnotation | note.nkmk.me https://note.nkmk.me/python-list-comprehension/

Recommended Posts

Lassen Sie sie den Aozora Bunko langsam lesen: Codeverbesserung
Lassen Sie sie die Bibliothek des blauen Himmels langsam lesen
Lassen Sie sie den Aozora Bunko langsam lesen: Genauer
Lassen Sie sie die Bibliothek des blauen Himmels langsam lesen
Clustering von Büchern von Aozora Bunko mit Doc2Vec
Lassen Sie sie den Aozora Bunko langsam lesen: Genauer
Lassen Sie sie den Aozora Bunko langsam lesen: Codeverbesserung
Lassen Sie uns die Verarbeitung natürlicher Sprache mit der COTOHA-API genießen
Schwer zu lesende Hinweise zur Codeverbesserung