2016-05-02 8 views
2

Ich versuche, etwas Text von einer Webseite zu kratzen. Auf meiner Webseite gibt es eine Liste von Wörtern, die angezeigt werden. Einige von ihnen sind sichtbar, andere werden sichtbar, wenn ich auf "+ Mehr" klicke. Einmal geklickt, ist die Liste der Wörter immer gleich (gleiche Reihenfolge gleiche Wörter). Einige davon sind jedoch fett gedruckt, andere sind gelöscht. Also im Grunde hat jedes Element der Datenbank einige Funktionen. Was ich gerne tun würde: Für jeden Artikel sagen Sie mir, welche Funktionen verfügbar sind und welche nicht. Mein Problem ist, den "+ More" -Button zu überwinden.Wie scrappe ich versteckten Text von einer Webseite?

Mein Skript funktioniert nur für die angezeigten Wörter und nicht für diejenigen, die durch "+ More" verdeckt sind. Was ich versuche, ist, alle Wörter zu sammeln, die unter dem Knoten "del" folgen. Ich dachte zunächst, dass durch lxml würde die Webseite geladen wurde, wie es Element in Chrom inspizieren erscheint und ich schrieb meinen Code entsprechend:

from lxml import html 

tree = html.fromstring(br.open(current_url).get_data()) 

mydata={} 

if len(tree.xpath('//del[text()='some text']')) > 0: 
    mydata['some text'] = 'text is deleted from the web page!' 
else: 
    mydata['some text'] = 'text is not deleted' 

Jedes Mal, wenn ich diesen Code lief, was ich sammeln kann, ist tatsächlich Teil der Daten wird auf der Webseite angezeigt, aber nicht die vollständige Liste der Wörter, die nach dem Klicken auf "+ More" angezeigt werden würden.

Ich hatte versucht Selen, aber soweit ich verstehe, ist es nicht zum Parsen gedacht, sondern um mit der Webseite zu interagieren. Aber wenn ich das ausgeführt habe:

from selenium import webdriver 

driver = webdriver.Chrome() 
driver.get('https://www.mywebpage.co.uk') 

a = driver.find_element_by_xpath('//del[text()="some text"]') 

Ich bekomme entweder das Element oder einen Fehler. Ich möchte eine leere Liste bekommen, damit ich tun konnte:

mydata = {} 

if len(driver.find_element_by_xpath('//del[text()="some text"]')) > 0: 
    mydata['some text'] = 'text is deleted from the web page!' 
else: 
    mydata['some text'] = 'text is not deleted' 

oder einen anderen Weg finden, um diese „versteckte“ Elemente vom Skript erfasst zu erhalten.

Meine Frage ist, hat jemand diese Art von Problem gehabt? Wie haben sie das geregelt?

Antwort

0

Wenn ich richtig verstehe, möchten Sie das Element in einer Liste finden. Selenium löst jedoch eine ElementNotFoundException aus, wenn das Element auf der Seite nicht verfügbar ist, anstatt eine Liste zurückzugeben.

Die Frage, die ich habe, ist, warum willst du eine Liste? Ausgehend von Ihrem Beispiel möchten Sie sehen, ob ein Element auf der Seite vorhanden ist oder nicht. Sie können dies leicht erreichen, indem Sie ein try/except verwenden.

from selenium.common.exceptions import TimeoutException 

try: 
    driver.find_element_by_xpath('//del[text()="some text"]') 
    mydata['some text'] = 'text is deleted from the web page!' 
except TimeOutException: 
    mydata['some text'] = 'text is not deleted' 

Wenn Sie diese Liste wirklich benötigen, können Sie die Seite nach mehreren Elementen durchsuchen. Dadurch werden alle Elemente zurückgegeben, die mit dem Locator in einer Liste übereinstimmen. Dazu ersetzen:

driver.find_element_by_xpath('//del[text()="some text"]') 

Mit (Element s):

driver.find_elements_by_xpath('//del[text()="some text"]') 
+0

Hallo @RemcoW. Danke für die Antwort. Ja, auf meiner Webseite gibt es eine Liste der angezeigten Wörter. Einige von ihnen sind sichtbar, andere werden sichtbar, wenn ich auf "+ Mehr" klicke. Einmal geklickt, ist die Liste der Wörter immer gleich (gleiche Reihenfolge gleiche Wörter). Einige davon sind jedoch fett gedruckt, andere sind gelöscht. Also im Grunde hat jedes Element der Datenbank einige Funktionen. Was ich gerne tun würde: Für jeden Artikel sagen Sie mir, welche Funktionen verfügbar sind und welche nicht. Mein Problem ist, den "+ More" -Button zu überwinden. – user0978189

+0

Mein Skript funktioniert nur für die angezeigten Wörter und nicht für die, die durch "+ More" verdeckt sind. Ich werde deinen Code ausprobieren und dich wissen lassen. Meine Angst mit Selen ist, dass es sehr langsam aussieht ... – user0978189

+0

Es öffnet nur die Webseite und speichert keine Daten in meinem Wörterbuch.; ( – user0978189

Verwandte Themen