[PYTHON] Faites-leur lire lentement l'Aozora Bunko: amélioration du code

La dernière fois a réussi à lire à haute voix tout en s'inscrivant lentement dans le dictionnaire (SofTalk). Cette fois, j'améliorerai le code précédent en lisant la documentation officielle et les articles associés pour étudier.

De la fiche de livre à l'acquisition d'URL

Code amélioré

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 est une bibliothèque Python qui récupère les données des fichiers HTML et XML. ** ** De Beautiful Soup 4.2.0 Doc. Traduction japonaise

Analyser sa structure en passant un document HTML au constructeur BeautifulSoup

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

`` 'lxml' 'spécifie un analyseur (analyseur de syntaxe) Vous pouvez choisir l'analyseur HTML du standard Python (piles incluses) html, parser, fast lxml, et très généreux html5lib. La documentation officielle semble recommander lxml

If you can, I recommend you install and use lxml for speed. Depuis la documentation de Beautiful Soup 4.9.0

Requests

** Requests est une bibliothèque HTTP basée sur une licence Apache2 écrite en Python et conçue pour être conviviale. ** ** Depuis Requests: HTTP for Humans

Passer l'URL à requests.get () renverra un objet Response Vous pouvez utiliser .text et .content pour obtenir le contenu de Response

À partir du document officiel


import requests
r = request.get(URL)
r.content #Obtenez des données binaires
r.text    #Obtenir des données textuelles

Je ne connais pas la différence entre le binaire et le texte, mais selon [^ stack] ici, c'est «.text» pour HTML et XML, et «.content» pour les images et PDF.

Obtenez 2 types d'URL (XHTML / zip)

Il existe différentes manières d'obtenir des éléments, mais je pense que le sélecteur CSS est le plus polyvalent.

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

À partir du document officiel


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

Extrayez chaque URL de la page de Aozora Bunko Book Card Notez que la valeur de retour de soup.select est list

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

Les liens des pages de la carte livre Aozora Bunko vers chaque page sont répertoriés comme liens relatifs. Utilisez ʻurljoin` pour synthétiser avec l'URL d'origine et revenir à un lien absolu

urllib.parse.urljoin(base, url, allow_fragments=True) ** Combinez l '"URL de base" (base) avec une autre URL (url) pour former une URL complète ("URL absolue"). ** ** De urllib.parse --- analyser l'URL dans le composant

À partir du document officiel


>>> 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

Si vous souhaitez renvoyer plusieurs valeurs de retour (deux URL cette fois), cela semble être le plus simple à écrire comme ceci

En Python, retournez simplement séparés par des virgules pour renvoyer toutes les chaînes et les nombres. De Comment renvoyer plusieurs valeurs de retour avec une fonction Python | note.nkmk.me

Dans ce cas, la valeur de retour sera un taple.

À partir de l'extraction de rubis de la page XHTML

Code amélioré

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"))

Extraction de Rubi

Extrayez les caractères sous la balise ruby du corps XHTML d'Aozora Bunko Je pense que .select (" ruby ") est le plus simple

Vérifiez le contenu acquis pour le moment Vous pouvez extraire la partie chaîne de caractères avec .get_text (), mais elle ne peut pas être appliquée à la liste, alors tournez-la avec l'instruction for.

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

#Lourd
#Cadavre
#Mariya
# ︙

Il est sorti sous la forme de Kanji (ruby)

Créer une liste de rubis

Énumérez le rubis acquis. Il est difficile à utiliser dans une liste de simples [" kanji "," kanji ", ...], donc [[" kanji "," yomigana "], [" kanji "," yomigana " ], ...] Créer un tableau à deux dimensions

Lors de la création d'une liste avec une instruction for, vous aviez l'habitude de créer une liste vide avant l'instruction for et d'y ajouter des éléments. Cependant, il semble qu'il puisse être créé en une phrase en utilisant la méthode ** notation d'inclusion de liste ** [^ naihou1] [^ naihou2]

x = [i.get_text().replace(")", "").split("(") for i in _ruby]
# [['Lourd', 'Parapluie'], ['Cadavre', 'Difficile'], ['Mariya', 'Marie'],...]

Katata à Hiragana

Afin de s'inscrire dans le dictionnaire de SofTalk, le pseudonyme de lecture est transformé en hiragana. Selon cet article Qiita, jaconv semble convenir à cet usage.

jaconv (Japanese Converter) effectue une conversion rapide des types de caractères hiragana, katakana, pleine largeur et demi-largeur. Comme il n'est implémenté qu'en Python, il peut être utilisé même dans un environnement où le compilateur C ne peut pas être utilisé. De jaconv / README_JP.rst à master · ikegami-yukino / jaconv · GitHub

for index, item in enumerate(_rubylist):
    _rubylist[index][1] = jaconv.kata2hira(item[1])
# [['Lourd', 'Parapluie'], ['Cadavre', 'Difficile'], ['Mariya', 'Mariya'],...]

[^ naihou1]: Création de liste d'écriture concise en utilisant la notation d'inclusion --Qiita https://qiita.com/tag1216/items/040e482f9844805bce7f

[^ naihou2]: Comment utiliser la notation d'inclusion de liste | note.nkmk.me https://note.nkmk.me/python-list-comprehension/

Recommended Posts

Faites-leur lire lentement l'Aozora Bunko: amélioration du code
Demandez-leur de lire lentement la bibliothèque du ciel bleu
Faites-leur lire lentement l'Aozora Bunko: plus précisément
Demandez-leur de lire lentement la bibliothèque du ciel bleu
Clustering des livres d'Aozora Bunko avec Doc2Vec
Faites-leur lire lentement l'Aozora Bunko: plus précisément
Faites-leur lire lentement l'Aozora Bunko: amélioration du code
Profitons du traitement du langage naturel à l'aide de l'API COTOHA
Notes d'amélioration du code difficile à lire