Seite 1 von 1
BeautifulSoup Wikipedia parsen
Verfasst: Dienstag 1. Juli 2014, 18:40
von Xfd7887a
Code: Alles auswählen
import requests
from BeautifulSoup import BeautifulSoup as soup
import pprint
url = "http://de.wikipedia.org/wiki/Liste_der_chemischen_Elemente"
data = requests.get(url).text
soup = soup(data)
elemente = {}
for x in range(0, 250, 2):
try:
elemente[str(soup("td", {"align": "left"})[x].a.string)] = [
str(soup("td", {"align": "right"})[x].string),
str(soup("td", {"align": "right"})[x].string)
]
except IndexError:
continue
pprint.pprint(elemente)
Habe gerade das Modul
BeautifulSoup entdeckt. Echt coole Sache, aber leider schaffe ich es nicht, den Elementen des PSE Schmelz- und Siedetemperatur zuzuordnen. Wie kann man das machen?
Re: BeautifulSoup Wikipedia parsen
Verfasst: Dienstag 1. Juli 2014, 20:37
von darktrym
Wo liegt denn da das Problem?
Jede Zeile hat den Tag tr und die wiederum besteht aus einer festen Anzahl von td Tags.
Re: BeautifulSoup Wikipedia parsen
Verfasst: Mittwoch 2. Juli 2014, 08:45
von mcdwerner
@Xfd7887a
falls Du sowas öfter brauchst, Wikipedia bietet auch eine API:
http://www.mediawiki.org/wiki/API
Die kann u.a. JSON zurückliefern, was viel einfacher und verlässlicher zu parsen ist

Re: BeautifulSoup Wikipedia parsen
Verfasst: Mittwoch 2. Juli 2014, 09:22
von BlackJack
@mcdwerner: Wie soll das einfacher sein? Dann bekommt man halt JSON zurück was die Wikiseite als *HTML* enthält. Also muss man auch in diesem Fall die Informationen aus dem HTML parsen, nur dass man noch einen zusätzlichen Schritt vorher mit dem JSON hat, statt direkt das HTML abzufragen. Ich sehe den Gewinn nicht. Die API ist nützlich wenn man Metainformationen über die Seiten einfacher haben möchte als sie aus dem HTML zu kratzen.
@Xfd7887a: Um sich die Struktur von Webseiten anzuschauen und welche Attribute man zum identifizieren von Elementen verwenden kann, kann man entsprechende Plugins für den Browser verwenden. Bei Firefox zum Beispiel die bereits eingebauten Web Developer Tools oder Firebug (+ diverse Erweiterungen).
Re: BeautifulSoup Wikipedia parsen
Verfasst: Mittwoch 2. Juli 2014, 10:11
von mcdwerner
@Blackjack: die API liefert nicht nur html zurück, sondern u.a. auch das eigene "Wikimedia Format":
als xml:
http://de.wikipedia.org/w/api.php?actio ... n_Elemente
als json:
http://de.wikipedia.org/w/api.php?actio ... ormat=json
dieses Wikimedia Format muss man natürlich auch nochmal parsen, für mich hat sich die Einarbeitung darin gelohnt, deswegen auch nur "wenn Du das öfter brauchst"

Re: BeautifulSoup Wikipedia parsen
Verfasst: Mittwoch 2. Juli 2014, 11:04
von BlackJack
@mcdwerner: Statt einen fertigen HTML-Parser auf eine HTML-Tabelle loszulassen wobei von der Struktur her HTML eher Richtung maschinelle Verarbeitung optimiert ist, soll man sich mit dem Parsen von Wikimarkup beschäftigen was von der Struktur eher auf den menschlichen Schreiber optimiert ist? Auch ein „wenn man das öfter braucht”-Zusatz macht da keinen Sinn.
Solange man keine Informationen benötigt die beim rendern als HTML verloren gehen, oder dort nicht mehr so einfach abfragbar sind, ist es soweit ich das sehe immer einfacher das HTML auszuwerten als den Wikitext zu parsen. Selbst wenn man einen fertigen Mediawiki-Parser verwendet, fehlen einem ja noch die Such- und Navigationsmöglichkeiten die BeautifulSoup oder `lxml.html` bieten.
Oder mal als Code ausgedrückt:
Code: Alles auswählen
from collections import namedtuple
import requests
from bs4 import BeautifulSoup
Element = namedtuple(
'Element', 'name symbol atomic_number weight density melt boil'
)
def parse_float(string):
if not string.strip():
return float('nan')
if string.startswith(u'\N{MINUS SIGN}'):
string = '-' + string[1:]
return float(string.replace(',', '.'))
def parse_element_table(html_source):
soup = BeautifulSoup(html_source)
parsers = (
unicode,
unicode,
int,
parse_float,
parse_float,
parse_float,
parse_float,
)
for row in soup.find('table', 'wikitable').tr.find_next_siblings('tr'):
yield Element(*(p(c.text) for p, c in zip(parsers, row('td')[:7])))
def main():
url = 'http://de.wikipedia.org/wiki/Liste_der_chemischen_Elemente'
response = requests.get(url)
elements = list(parse_element_table(response.text))
print elements
if __name__ == '__main__':
main()
Re: BeautifulSoup Wikipedia parsen
Verfasst: Mittwoch 2. Juli 2014, 14:55
von Xfd7887a
Danke für die Antworten

!