如何用Selenium Python提取自动完成功能的数据

1 投票
1 回答
2279 浏览
提问于 2025-04-18 14:19

我正在尝试从一个搜索框中提取数据,你可以在维基百科上看到一个很好的例子。

这是我的代码:

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 个回答

1

与其传递包含空的 suggestions div 的 .page_source,不如直接获取这个元素的 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

撰写回答