python - Scraper 无法从下一页获取名称

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

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

最佳答案

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

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)

关于python - Scraper 无法从下一页获取名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46773924/

相关文章:

python - Flask、SQLAlchemy 和流响应时的高内存使用率

python-3.x - Twilio 多个收件人

python - 将 YAML 文件转换为 Python JSON 对象

django - 如何在 UpdateAPIView 中返回自定义 JSON 响应?

javascript - 如何使用Selenium获取网站实时股价?

jquery - 基于绝对位置在 Jquery 中选择元素?

java - 通过 selenium Java 选择单选按钮

python - 如何在python爬虫中保存存储(常用字符串)

Python 到 SQLite3

python - 我如何找到从 1 到 A 的最小合法跳跃次数?