【问题标题】:Using Selenium to extract data provided by an autocomplete search使用 Selenium 提取自动完成搜索提供的数据
【发布时间】:2016-09-30 13:24:37
【问题描述】:

我想提取网站搜索栏自动完成提供的部分结果。我无法提取结果。我可以输入我想要的查询,但我无法存储自动建议。似乎每当我单击下拉建议以“检查元素”以查找要选择的内容时,下拉菜单就会消失!

这是我正在使用的代码:

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

不出所料,错误是ValueError: XPath error: Invalid predicate in //div[@....[etc]。如何找到正确的名称以放入我的 XPath?

自动完成采用BELAWAN - Port [ID] 的形式,最终目标是退出ID

编辑: screenshot

【问题讨论】:

  • 您可以使用 webdriver 的 select 类和 select_by_index 或 select_by_value API 轻松完成您的任务。参考selenium-python.readthedocs.io/api.html
  • 对,但我如何找到要选择的内容?
  • 如果您可以添加要查找的元素的屏幕截图,那么也许我可以提供更好的帮助。现在写我去了你的网址并输入了belawan关键字,但之后我迷路了。
  • 抱歉 - 没想到。
  • Saurabh baid 为你解答,干杯。

标签: python selenium selenium-chromedriver


【解决方案1】:

这应该可行。 基本上你会找到那些 web 元素的 xpath 定位器'

在你的情况下,就像

<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>

所以我使用 id 获取另一个 ul,然后使用 find_elements_by_xpath 获取与 xpath 匹配的 childrend 列表。

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]']

【讨论】:

  • @345243lkj 如果这解决了你的问题,那么你可以接受这个作为答案。
  • 我知道!我做到了。我正在测试它。我必须做的一个小修改是在输入搜索框后添加time.sleep(1),因为有时它会在自动建议加载之前跳到下一步。有没有更优雅的方法来解决这个问题?
  • 您可以使用 selenium 隐式和显式等待查看更多详细信息seleniumhq.org/docs/04_webdriver_advanced.jsp
猜你喜欢
  • 2014-09-13
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
相关资源
最近更新 更多