【问题标题】:Scraper unable to get names from next pagesScraper 无法从下一页获取名称
【发布时间】:2017-10-16 15:32:54
【问题描述】:

我在 python 中结合 selenium 编写了一个脚本来解析网页中的名称。该站点的数据未启用 javascript。但是,下一页链接在 javascript 中。由于如果我使用 requests 库,该网页的下一页链接将毫无用处,因此我已使用 selenium 解析来自该站点的遍历 25 页的数据。我在这里面临的唯一问题是,虽然我的刮刀能够通过 25 页点击到达最后一页,但它只从第一页获取数据。此外,即使点击了最后一页,刮板也会继续运行。下一页链接看起来与javascript:nextPage(); 完全相同。顺便说一句,即使我点击下一页按钮,该网站的网址也永远不会改变。如何从 25 页中获取所有名称?我在刮刀中使用的 css 选择器完美无缺。提前致谢。

这是我写的:

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

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10)

driver.get("https://www.hsi.com.hk/HSI-Net/HSI-Net?cmd=tab&pageId=en.indexes.hscis.hsci.constituents&expire=false&lang=en&tabs.current=en.indexes.hscis.hsci.overview_des%5Een.indexes.hscis.hsci.constituents&retry=false")

while True:
    for name in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "table.greygeneraltxt td.greygeneraltxt,td.lightbluebg"))):
        print(name.text)

    try:
        n_link = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "a[href*='nextPage']")))
        driver.execute_script(n_link.get_attribute("href"))
    except: break

driver.quit()

【问题讨论】:

    标签: python python-3.x selenium selenium-webdriver web-scraping


    【解决方案1】:

    您不必处理“下一步”按钮或以某种方式更改页码 - 所有条目都已在页面源中。试试下面:

    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
    
    driver = webdriver.Chrome()
    wait = WebDriverWait(driver, 10)
    
    driver.get("https://www.hsi.com.hk/HSI-Net/HSI-Net?cmd=tab&pageId=en.indexes.hscis.hsci.constituents&expire=false&lang=en&tabs.current=en.indexes.hscis.hsci.overview_des%5Een.indexes.hscis.hsci.constituents&retry=false")
    for name in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "table.greygeneraltxt td.greygeneraltxt,td.lightbluebg"))):
            print(name.get_attribute('textContent'))
    
    driver.quit()
    

    如果您不强制使用 Selenium,您也可以尝试此解决方案:

    import requests
    from lxml import html
    
    r = requests.get("https://www.hsi.com.hk/HSI-Net/HSI-Net?cmd=tab&pageId=en.indexes.hscis.hsci.constituents&expire=false&lang=en&tabs.current=en.indexes.hscis.hsci.overview_des%5Een.indexes.hscis.hsci.constituents&retry=false")
    source = html.fromstring(r.content)
    
    for name in source.xpath("//table[@class='greygeneraltxt']//td[text() and position()>1]"):
            print(name.text)
    

    【讨论】:

    • 你打败了我......我不认为第一位会起作用,因为你不能 get_attribute() 使用 Selenium 处理不可见的元素。我打算建议他使用 JSE,例如.execute_script("return arguments[0].innerText", name) 在你的情况下。
    • @JeffC, text 属性不允许获取隐藏元素的内容。 get_attribute('textContent')works fine for this purpose
    • 感谢安德森爵士提供了如此强大的解决方案。总有一天我会想出一个难题来解决,因为你一直是无敌的。再次感谢。
    • @Andersson 我不确定,但很高兴您已经对其进行了测试并且知道它有效。
    【解决方案2】:

    看起来这实际上可以比目前的方法更简单地完成。在 driver.get 方法之后,您可以简单地使用 page_source 属性来获取它背后的 html。从那里您可以一次从所有 25 个页面中获取数据。要查看它的结构,只需右键单击并在 chrome 中“查看源代码”。

    html_string=driver.page_source
    

    【讨论】:

      猜你喜欢
      • 2020-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-12
      • 1970-01-01
      • 2021-09-04
      相关资源
      最近更新 更多