2016-09-30 1 views
0

Ich möchte einen Teil des Ergebnisses extrahieren, das durch die automatische Vervollständigung einer Suchleiste einer Website bereitgestellt wird. Ich habe Probleme, das Ergebnis zu extrahieren. Ich kann die Abfrage eingeben, die ich möchte, aber ich kann die Autosuggestion nicht speichern. Es scheint immer, wenn ich die Drop-Down-Vorschläge auf "Inspect Element" klicken, um zu finden, was das Dropdown-Menü auswählen verschwindet!Verwenden von Selenium zum Extrahieren von Daten, die von einer automatischen Vervollständigungssuche bereitgestellt werden

Hier ist der Code Ich arbeite mit:

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
import os 
from scrapy.selector import HtmlXPathSelector 

#launch chromedirver 
driver.get("http://www.marinetraffic.com/en/ais/index/ports/all") 

searchBox = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located(
     (By.XPATH, '//input[@id= "portname"]') 
    ) 
) 
searchBox.click() 
searchBox.clear() 
a = searchBox.send_keys('Belawan') #so far so good 

selen_html = driver.find_element_by_class_name('input-group').get_attribute('innerHTML') 
hxs = HtmlXPathSelector(text=selen_html) 
suggests = hxs.select('//div[@class= "input-group"/Belawan/@title').extract 
driver.close() 

Der Fehler, wenig überraschend, ist ValueError: XPath error: Invalid predicate in //div[@....[etc]. Wie finde ich den richtigen Namen für meinen XPath?

Die Autocomplete nimmt das Formular BELAWAN - Port [ID] das Endziel ist, ID herausziehen.

Edit: screenshot

+0

können Sie WebDriver die Auswahl Klasse und select_by_index oder select_by_value APIs verwenden, um Ihre Aufgabe zu erfüllen easily.refer http://selenium-python.readthedocs.io/api.html –

+0

Richtig, aber wie finde ich was wählen ? –

+0

Wenn Sie einen Screenshot von dem Element, das Sie suchen, hinzufügen können, dann kann ich vielleicht besser helfen. schreibe jetzt ich ging zu deiner url und gab belawan keyword ein aber danach bin ich verloren. –

Antwort

2

Das sollte funktionieren. Grundsätzlich haben Sie

In Ihrem Fall, um die XPath von diesen Web-Elemente finden war es wie

<ul class="ui-autocomplete ui-front ui-menu ui-widget ui-widget-content ui-corner-all" id="ui-id-3" tabindex="0" style="display: none; top: 375px; left: 63px; width: 306px;"> 
    <li class="ui-menu-item" role="presentation"><a id="ui-id-7" class="ui-corner-all" tabindex="-1"><b>BELA</b>WAN&nbsp;-&nbsp;Port [ID]</a></li> 
    <li class="ui-menu-item" role="presentation"><a id="ui-id-8" class="ui-corner-all" tabindex="-1"><b>BELA</b>WAN ANCH&nbsp;-&nbsp;Ancorage [ID]</a></li> 
</ul> 

So habe ich id die andere ul zu erhalten und verwendet dann find_elements_by_xpath Liste der childrend Anpassung zu erhalten der XPath.

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
import os 

#launch chromedirver 
driver = webdriver.Chrome() 
driver.get("http://www.marinetraffic.com/en/ais/index/ports/all") 

searchBox = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located(
     (By.XPATH, '//input[@id= "portname"]') 
    ) 
) 
searchBox.click() 
searchBox.clear() 
a = searchBox.send_keys('Belawan') #so far so good 

web_elem_list = driver.find_element_by_id("ui-id-3").find_elements_by_xpath("//li[@role='presentation']/a") 
suggests = [web_elem.text for web_elem in web_elem_list] 
driver.close() 
print suggests 


# Will Give o/p 
[u'BELAWAN - Port [ID]', u'BELAWAN ANCH - Ancorage [ID]'] 
+0

@ 345243lkj Wenn dies Ihr Problem löst, können Sie dies als Antwort akzeptieren. –

+0

Ich weiß! Ich tat. Ich habe es getestet. Ein kleiner Schnitt, den ich machen musste, war ein 'time.sleep (1)' nach dem Eintippen in das Suchfeld hinzuzufügen, da es manchmal zum nächsten Schritt sprang, bevor der Autosuggest geladen wurde. Gibt es einen eleganteren Weg, das zu beheben? –

+0

Sie könnten Selen implizite und explizite Wartezeiten verwenden Hier finden Sie weitere Informationen http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp –

Verwandte Themen