2017-03-02 5 views
0

Lassen Sie uns sagen, dass wir HTML so (sorry, ich weiß nicht, wie zum Kopieren und Einfügen Seite Informationen und das ist in einem Intranet):BeautifulSoup: Extrahieren Attribut für verschiedene Elemente

enter image description here

Und Ich möchte den hervorgehobenen Teil für alle Fragen erhalten (dies ist wie eine Stapelüberlaufseite). EDIT: sein klarer, was mich interessiert ist, eine Liste erhalten, die hat:

['question-summary-39968', 
'question-summary-40219', 
'question-summary-42899', 
'question-summary-34348', 
'question-summary-32497', 
'question-summary-35308', 
...] 

Jetzt weiß ich, dass eine Arbeitslösung eine Liste Verständnis ist, wo ich tun konnte:

[item["id"] for item in html_df.find_all(class_="question-summary")] 

Aber das ist nicht genau das, was ich will. Wie kann ich direkt auf question-summary-41823 für den ersten Artikel zugreifen?

Was ist der Unterschied zwischen soup.select und soup.get?

+0

In seiner jetzigen Form löschen, es ist nicht, was Sie‘ Ich versuche zu wählen. 'supp.select()' funktioniert perfekt mit 'CSS' Selektoren. Alle '.question-summary' mit einer' id' => 'supp.select (". Question-summary [id] ")' –

+0

Wie ist das Listenverständnis nicht genau das, was Sie wollen? Muss das Ergebnis anders bestellt werden? – Ryan

+0

Nein, das Listenverständnis gibt mir eine Liste, die für meine Zwecke gut funktionieren wird. Ich versuche nur, BeautifulSoup besser zu verstehen und wie ich direkt auf etwas wie 'question-summary-41823' zugreifen kann. Ist das nicht möglich? – vashts85

Antwort

1

Ich dachte, ich würde meine Antwort hier posten, wenn es anderen hilft.

Was ich versuche, ist der Zugriff auf das id Attribut innerhalb der question-summary Klasse.

Jetzt können Sie etwas tun und zu erreichen, ist es nur das erste Element (Objekt?):

html_df.find(class_="question-summary")["id"] 

Aber Sie wollen es für alle von ihnen. So könnten Sie dies tun, um die Klassendaten zu erhalten:

html_df.select('.question-summary') 

Aber Sie nicht nur

html_df.select('.question-summary')["id"] 

tun, weil Sie eine Liste mit bs4.elements gefüllt haben. Sie müssen also über die Liste iterieren und nur das gewünschte Stück auswählen.Sie könnten eine for Schleife zu tun, aber eine elegantere Möglichkeit ist nur Verständnis Liste verwenden:

[item["id"] for item in html_df.find_all(class_="question-summary")] 

Breaking down was dies tut, ist es:

  • Es erstellt zunächst eine Liste aller question-summary Objekte aus die Suppe
  • Iteriert über jedes Element in der Liste, die wir item
  • Extrakte der id Attribut und fügt sie der Liste
  • 01.235.164 benannt haben

Alternativ können Sie select verwenden:

[item["id"] for item in html_df.find_all(class_="question-summary")] 

ich die erste Version bevorzugen, weil es expliziter ist, aber entweder ein Ergebnis in:

['question-summary-43960', 
'question-summary-43953', 
'question-summary-43959', 
'question-summary-43947', 
'question-summary-43952', 
'question-summary-43945', 
...] 
Verwandte Themen