Webseiten parsen mit LXML

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Fleyershaver
User
Beiträge: 5
Registriert: Dienstag 20. September 2011, 19:21
Kontaktdaten:

Hi,
ich habe einen Crawler in PHP und würde diesen gerne jetzt in Python umwandeln. Als Libery habe ich mich für XML entschieden, da es ja relativ schnell sein soll. In PHP sieht mein Code so aus:

Code: Alles auswählen

$html = file_get_html("http://animexx.onlinewelten.com/aidb/aod_episoden.php");
		$part = $html->find('div#animexx_bodycontent',0)->find('table',2);

		foreach($part->find('tr') as $article) {
			if(!empty($article->find('a',1)->plaintext)) {
				$name = $article->find('a',1)->plaintext;
				$url = "http://animexx.onlinewelten.com/aidb/".$article->find('a',1)->href;				
                                // Daten weiterverarbeiten
			}
		}
In Python bin ich bisschen so weit:

Code: Alles auswählen

from urllib.request import urlopen
import lxml.html as lh
page = urlopen('http://animexx.onlinewelten.com/aidb/aod_episoden.php')
p = lh.parse(page).getroot()



for serie in p.xpath(".//div[@id='animexx_bodycontent']//table[2]//tr"):
    if serie.xpath("//a[1]")[0].text_content() != "":
        #print("Name: "+serie.text_content())
        #print("URL: "+serie.get('href'))

        print("Irgendwas")

Leider scheine ich hier ( if serie.xpath("//a[1]")[0].text_content() != "": ) schon etwas falsch falsch zu machen.
Hat einer von euch eine Idee wie ich das richtig machen muss? Gibt es vllt. ein gutes Tutorial dazu?(hab ich schon auf der Entwicklerseite geguckt + gegoogelt aber nichts gefunden was wirklich in meine Richtung geht)

Danke schonmal für eure Hilfe
http://www.filmeo.de - Kostenlose Filme & Serien finden
deets

Was heisst denn "was falsch zu machen"? Gibt es eine exception, gibt es einfach nur keine Ergebnisse?
BlackJack

@Fleyershaver: Probier das doch einfach mal Schrittweise aus und schau Dir die Zwischenergebnisse an. Dann kommst Du sehr schnell an den Punkt wo das Problem liegt:

Code: Alles auswählen

In [69]: page.xpath(".//div[@id='animexx_bodycontent']")
Out[69]: [<Element div at 97b556c>]

In [70]: page.xpath(".//div[@id='animexx_bodycontent']/table")
Out[70]: [<Element table at 97b5ecc>]

In [71]: page.xpath(".//div[@id='animexx_bodycontent']/table[2]")
Out[71]: []
Wenn man sich das HTML anschaut gibt es dort auch nur eine Tabelle in dem ``div``-Element. Die anderen Tabellen sind dort drin *verschachtelt*. Also musst Du da entweder auch den Pfad so schreiben das er zu so einer inneren Tabelle führt, oder die ``table``-Elemente in dem ``div`` auch rekursiv suchen lassen, so wie Du das mit dem ``div`` selbst gemacht hast.
Fleyershaver
User
Beiträge: 5
Registriert: Dienstag 20. September 2011, 19:21
Kontaktdaten:

Ich bin jetzt sogar noch einen Schritt weiter zurückgegeben um XPATH zu verstehen. Mein jetziger Quelltext sieht so aus:

Code: Alles auswählen

from urllib.request import urlopen
import lxml.html as lh
p = lh.parse('http://animexx.onlinewelten.com/aidb/aod_episoden.php').getroot()

print(p)
print(p.xpath('//div[@id="animexx_bodycontent"]'))
Folgendes kommt dabei raus:

Code: Alles auswählen

<Element html at 0x31398e0>
[]
Warum ist das zweite Element komplett leer?(das entsprechende Div existiert doch)
http://www.filmeo.de - Kostenlose Filme & Serien finden
deets

Noe, tut es nicht. Bei mir ist das ein article-tag. Da musst du entweder das div zu article umschreiben, oder stattdessen node() verwenden.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mach es doch mal wie von BlackJack angeregt: Entwickle das Schritt für Schritt in einer Shell! Alternativ kann man XPath-Ausdrücke auch in einer (diversen?) Firefox-Erweiterung entwickeln.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Fleyershaver
User
Beiträge: 5
Registriert: Dienstag 20. September 2011, 19:21
Kontaktdaten:

@deets: Danke, genau das war mein Fehler...bei PHP hats komischerweise im Script mit div funktioniert.
http://www.filmeo.de - Kostenlose Filme & Serien finden
Antworten