Verwenden Sie "zip".
Verwenden Sie in der Artikelliste einer Site "BeautifulSoup4", um eine Liste der URLs und Titel abzurufen. Der Zweck besteht darin, eine Liste von "[" url >>> title "," url >>> title "] zu erstellen, die die URL und den Titel mit"> >> "verbindet.
Wenn die Seite einen Titel im a-Tag-Element hat, wie unten gezeigt ...
import requests, bs4
res = requests.get('https://qiita.com/takuto_neko_like')
posts = bs4.BeautifulSoup(res.text, 'html.parser').select('.u-link-no-underline')
print(posts)
Die Variable posts
enthält <class'bs4.element.Tag '>
, und Sie können den Inhalt eines HTML-Tags anzeigen, indem Sie einzeln als posts [0] darauf zugreifen.
Der Titel wird im Element des a-Tags beschrieben
[<a class="u-link-no-underline" href="/takuto_neko_like/items/52c6c52385386544aa62">Wo ich mir Sorgen um Heroku machte</a>, <a class="u-link-no-underline" href="/takuto_neko_like/items/c5791f267e0964e09d03">Ich habe ein Tool erstellt, um neue Artikel zu erhalten</a>, <a class="u-link-no-underline" href="/takuto_neko_like/items/93b3751984e5e3fd3670">Fisch bewegte sich zu langsam, um Ärger zu machen</a>, <a class="u-link-no-underline" href="/takuto_neko_like/items/62aeb4271614f6f0347f">Verwenden Sie Diagramme, die mit Plotly mit Django erstellt wurden</a>, <a class="u-link-no-underline" href="/takuto_neko_like/items/c9c80ff453d0c4fad239">【Python】super()Gründe für das Überschreiben mit</a>, <a class="u-link-no-underline" href="/takuto_neko_like/items/14e92797fa2b23a64adb">[Python] Was wird durch Mehrfachvererbung geerbt?</a>, <a class="u-link-no-underline" href="/takuto_neko_like/items/6cf9bade3d9515a724c0">【Python】@Was sind Klassenmethoden und Dekorateure?</a>, <a class="u-link-no-underline" href="/takuto_neko_like/items/aed9dd5619d8457d4894">【Python】*args **Was ist Kwrgs?</a>, <a class="u-link-no-underline" href="/takuto_neko_like/items/bb8d0957347636b5bf4f">[Bootstrap] So reparieren Sie die Navigationsleiste und zeigen sie an, auch wenn Sie einen Bildlauf durchführen</a>]
Der Inhalt jedes Tags ist "<class'bs4.element.Tag"> "= Tag-Objekt. Wenn Sie es also in einen Zeichenfolgentyp mit str () konvertieren, können Sie" .find () "mit" Tag-Namen und -Attributen verwenden. Unter Verwendung des Index, der durch Angabe des Namens usw. erhalten wird, können nur die Zeichenfolgen des URL-Teils und des Titelteils extrahiert werden.
URL und Titel formatieren
for post in posts:
#URL extrahieren
index_first = int(str(post).find('href=')) + 6
index_end = int(str(post).find('">'))
url = (str(post)[index_first : index_end])
#Titel extrahieren
index_first = int(str(post).find('">')) + 2
index_end = int(str(post).find('</a'))
title = (str(post)[index_first : index_end].replace('\u3000', ' '))
url_title_set.append(f"{url}>>>{title}")
Wenn ja, ist es geschafft.
Es gibt jedoch viele Websites vom Typ **, bei denen kein Titel als Element des Tags ** a aufgeführt ist. Beispielsweise wird ein Muster, in dem Artikelinformationen als Karte angezeigt werden, die aus einem Bild und einem Titel besteht, und ein Link an die gesamte Karte angehängt.
Beispiel
<div class='card'><a href='#' class='link'>
<div class='image'><img src='#'></div>
<div class='title'>Titel</div>
</a>
</div>
In einem solchen Fall können Sie in das div-Tag gelangen, auf das die Kartenklasse angewendet wird, indem Sie die Klasse card
in .select
von bs4 angeben. Ich möchte von dort die href-Informationen des a-Tags und des Elements der Titelklasse div abrufen.
Der eigentliche Code hat mehr überlappende Elemente, daher kann es etwas ärgerlich sein, eine bestimmte Zeichenfolge in .find aus dem übergeordneten Element zu finden.
BS4 hat auch eine Möglichkeit, auf die untergeordneten Elemente zuzugreifen, aber es schien ein bisschen ärgerlich, als ich mir die Dokumentation ansah, so dass ich jedes einzeln wie folgt bekam.
posts_links = bs4.BeautifulSoup(res.text, 'html.parser').select('.link')
posts_titles = bs4.BeautifulSoup(res.text, 'html.parser').select('.title')
Ich werde einzeln auf das "Tag-Objekt" zugreifen, indem ich die Liste der Beiträge mit der for-Anweisung mit der URL und dem Titelformat des vorherigen Codes umdrehe. Diesmal gibt es jedoch zwei Listen. Drehen Sie zwei Listen gleichzeitig mit einer for-Anweisung und kombinieren Sie die URL und den Titel, die Sie aus jeder Liste erhalten haben. Dann möchte ich es in einer neuen Liste speichern.
Auf diese Weise verwenden Sie "zip", wenn Sie mehrere Listen gleichzeitig mit einer for-Anweisung drehen möchten.
now_posts_link_title_set = []
for (posts_link, posts_title) in zip(posts_links, posts_titles):
index_first = int(str(posts_link).find('href=')) + 6
index_end = int(str(posts_link).find('">'))
posts_link_set = (str(posts_link)[index_first : index_end])
index_first = int(str(posts_title).find('h2')) + 3
index_end = int(str(posts_title).find('</h2'))
posts_title_set = (str(posts_title)[index_first : index_end].replace('\u3000', ' ')) #Leerer Ersatz
now_posts_link_title_set.append(f"{posts_link_set}>>>{posts_title_set}")
Es ist okay, mehr als zwei zu haben
for (a, b, c, d) in zip(a_list, b_list, c_list, d_list)
Wenn sich die Anzahl der Elemente in der Liste unterscheidet, wird das größere ignoriert
aa = [1,2,3,4,5]
bb = ['a', 'b', 'c']
for (a, b) in zip(aa, bb):
print(f'{a} : {b}')
#Ergebnis
1 : a
2 : b
3 : c
Das ist praktisch
Recommended Posts