@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()