如何使用selenium python从自动完成框中提取数据

时间:2014-07-22 18:27:07

标签: python selenium xpath web-scraping scrapy

我正在尝试从搜索框中提取数据,您可以在wikipedia上看到一个很好的示例

这是我的代码:

driver = webdriver.Firefox()
    driver.get(response.url)                
    city = driver.find_element_by_id('searchInput') 
    city.click()
    city.clear()
    city.send_keys('a')
    time.sleep(1.5) #waiting for ajax to load              
    selen_html = driver.page_source
    #print selen_html.encode('utf-8')
    hxs = HtmlXPathSelector(text=selen_html)
    ajaxWikiList = hxs.select('//div[@class="suggestions"]')
    items=[]
    for city in ajaxWikiList:
        item=TestItem()
        item['ajax'] = city.select('/div[@class="suggestions-results"]/a/@title').extract()
        items.append(item)
    print items    

Xpath表达式没问题,我在静态页面上查了一下。如果我取消注释打印出废弃的html代码的行,则该框的代码显示在文件的末尾。但由于某些原因,我无法使用上述代码从中提取数据?我必须错过一些东西,因为我尝试了两个不同的来源,维基百科页面只是我无法提取这些数据的另一个来源。 有什么建议吗?谢谢!

1 个答案:

答案 0 :(得分:1)

不是传递.page_source,而是在你的情况下包含一个空的suggestions div,而是获取元素的innerHTML并将其传递给Selector

selen_html = driver.find_element_by_class_name('suggestions').get_attribute('innerHTML')

hxs = HtmlXPathSelector(text=selen_html)
suggestions = hxs.select('//div[@class="suggestions-results"]/a/@title').extract()
for suggestion in suggestions:
    print suggestion

输出:

Animal
Association football
Arthropod
Australia
AllMusic
African American (U.S. Census)
Album
Angiosperms
Actor
American football

请注意,最好使用selenium Waits功能等待元素可访问/可见,请参阅:

另请注意,HtmlXPathSelector已弃用,请改用Selector