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.
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.
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.
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"))
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)
É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'],...]
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