【问题标题】:Selenium Python - Access next pages of search resultsSelenium Python - 访问搜索结果的下一页
【发布时间】:2014-06-11 15:20:30
【问题描述】:

我必须从这个网址一个一个地点击每个搜索结果:

Search Guidelines

我首先从显示的文本中提取结果的总数,以便我可以设置迭代的上限

upperlimit=driver.find_element_by_id("total_results")
number = int(upperlimit.text.split(' ')[0])

然后循环被定义为 for i in range(1,number):

但是,在浏览完第一页上的前 10 个结果后,列表索引超出了范围(可能是因为没有更多可点击的链接)。我需要单击“下一步”以获取接下来的 10 个结果,依此类推,直到我完成所有搜索结果。我该怎么做呢?

任何帮助将不胜感激!

【问题讨论】:

    标签: python selenium web-scraping


    【解决方案1】:

    问题是页面加载后id为total_results的元素的值发生了变化,一开始是117,然后变成44

    相反,这是一种更稳健的方法。它逐页处理,直到没有更多页面:

    from selenium import webdriver
    from selenium.common.exceptions import NoSuchElementException
    
    driver = webdriver.Firefox()
    url = 'http://www.nice.org.uk/Search.do?searchText=bevacizumab&newsearch=true#/search/?searchText=bevacizumab&mode=&staticTitle=false&SEARCHTYPE_all2=true&SEARCHTYPE_all1=&SEARCHTYPE=GUIDANCE&TOPICLVL0_all2=true&TOPICLVL0_all1=&HIDEFILTER=TOPICLVL1&HIDEFILTER=TOPICLVL2&TREATMENTS_all2=true&TREATMENTS_all1=&GUIDANCETYPE_all2=true&GUIDANCETYPE_all1=&STATUS_all2=true&STATUS_all1=&HIDEFILTER=EGAPREFERENCE&HIDEFILTER=TOPICLVL3&DATEFILTER_ALL=ALL&DATEFILTER_PREV=ALL&custom_date_from=&custom_date_to=11-06-2014&PAGINATIONURL=%2FSearch.do%3FsearchText%40%40bevacizumab%26newsearch%40%40true%26page%40%40&SORTORDER=BESTMATCH'
    driver.get(url)
    
    page_number = 1
    while True:
        try:
            link = driver.find_element_by_link_text(str(page_number))
        except NoSuchElementException:
            break
        link.click()
        print driver.current_url
        page_number += 1
    

    基本上,这里的想法是获取下一页链接,直到没有这样的链接(NoSuchElementException 会被抛出)。请注意,它适用于任意数量的页面和结果。

    打印出来:

    http://www.nice.org.uk/Search.do?searchText=bevacizumab&newsearch=true&page=1
    http://www.nice.org.uk/Search.do?searchText=bevacizumab&newsearch=true&page=2#showfilter
    http://www.nice.org.uk/Search.do?searchText=bevacizumab&newsearch=true&page=3#showfilter
    http://www.nice.org.uk/Search.do?searchText=bevacizumab&newsearch=true&page=4#showfilter
    http://www.nice.org.uk/Search.do?searchText=bevacizumab&newsearch=true&page=5#showfilter
    

    【讨论】:

    • 哦,是的,这个很好用。但是我需要在这个中加入其他功能。如果我有任何问题可以回复您吗?
    • @user3691767 当然,如果您需要进一步的帮助,请考虑创建单独的 SO 问题。此外,如果这个问题得到解决,请考虑接受您认为应得的任何答案。谢谢。
    • 你刚刚度过了我的一天@alecxe 我正要整夜思考如何解决这个问题。我现在能够遍历每个搜索结果并获取所需的数据。谢谢一百万!!!!
    【解决方案2】:

    甚至不需要以编程方式按下Next按钮,如果你仔细看,在浏览其他结果页面时,该url只需要一个新参数:

    url = "http://www.nice.org.uk/Search.do?searchText=bevacizumab&newsearch=true&page={}#showfilter"
    
    for i in range(1,5):
        driver.get(url.format(i))
    
        upperlimit=driver.find_element_by_id("total_results")
        number = int(upperlimit.text.split(' ')[0])
    

    如果您仍想以编程方式按下可以使用的下一个按钮:

    driver.find_element_by_class_name('next').click()
    

    但我还没有测试过。

    【讨论】:

    • 对于我搜索的每个关键字,结果的数量都不同。从您提供的代码中,将范围设置为 5 不会对其他关键字起作用吗?
    • 我能做的是放一个这样的异常:除了 IndexError: driver.find_element_by_class_name("next").click().... 但这部分只有在它到达末尾时才会运行页面第一次,然后它只是继续点击下一步,而我想重新开始整个事情。
    • @user3691767 我只展示了一个关于你的问题的例子,点击下一步按钮,当然处理结果页面是不同的。 alecxe 展示了一种方法。
    猜你喜欢
    • 1970-01-01
    • 2019-10-03
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 2019-04-25
    • 2020-10-26
    相关资源
    最近更新 更多