返回

如何从网页中抓取表格?使用 Selenium 和 pandas 轻松实现

python

从网页中抓取表格:使用 Selenium 和 pandas

问题陈述

当你需要从网页中提取数据时,你会发现一个表格包含你需要的信息。但是,如何从该表格中获取数据呢?

方法

使用 pandas 和 Selenium 是从网页中提取表格数据的有效方法。

使用 pandas 读取表格

pandas 是一个强大的 Python 库,可用于轻松地读取和操作表格数据。要从网页中读取表格,可以使用 read_html() 函数。

import pandas as pd

# 假设 table_element 是包含表格的 HTML 元素
table_df = pd.read_html(table_element.get_attribute('outerHTML'))[0]

指定 URL

如果在点击搜索按钮后 URL 不会更改,你可以手动指定 URL 来读取表格。

import requests
from bs4 import BeautifulSoup

url = 'https://example.com/search_results.html'
html = requests.get(url).content
soup = BeautifulSoup(html, 'html.parser')

# 假设 table_element 是包含表格的 HTML 元素
table_df = pd.read_html(table_element.get_attribute('outerHTML'))[0]

使用 Selenium 提取表格

Selenium 允许你导航到页面、选择选项并单击搜索按钮。一旦页面加载完成,你可以抓取表格:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

# 启动 Selenium 浏览器
driver = webdriver.Chrome()

# 导航到页面
driver.get('https://example.com')

# 选择第一个选项
dropdown = driver.find_element(By.ID, 'dropdown_id')
dropdown.find_element(By.XPATH, "//option[text()='Option 1']").click()

# 选择第二个选项
dropdown = driver.find_element(By.ID, 'dropdown_id')
dropdown.find_element(By.XPATH, "//option[text()='Option 2']").click()

# 点击搜索按钮
search_button = driver.find_element(By.ID, 'search_button')
search_button.click()

# 等待表格加载
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, 'table_id'))
)

# 获取表格 HTML
table_html = driver.find_element(By.ID, 'table_id').get_attribute('outerHTML')

# 使用 pandas 读取表格
table_df = pd.read_html(table_html)[0]

优点

  • 使用 pandas 轻松读取表格数据。
  • 可以手动指定 URL 或使用 Selenium 导航和提取表格。
  • Selenium 允许在页面交互之前抓取表格。

局限性

  • 如果表格很大,使用 pandas 读取可能会很慢。
  • Selenium 导航可能会很慢,具体取决于页面加载时间。

结论

使用 Selenium 和 pandas 从网页中抓取表格是一个简单有效的过程。通过选择适当的方法并根据需要调整代码,你可以成功地提取表格数据。

常见问题解答

  1. 如何使用 Selenium 选择下拉菜单选项?

    • 使用 find_element() 函数查找下拉菜单元素,然后使用 click() 函数选择选项。
  2. 如何使用 WebDriverWait 等待元素加载?

    • 使用 WebDriverWait(driver, timeout) 创建一个 WebDriverWait 对象,然后使用 until() 函数指定等待条件,例如 EC.presence_of_element_located()
  3. 如何从 Selenium 元素中提取 HTML?

    • 使用 get_attribute('outerHTML') 函数获取元素的 HTML。
  4. 使用哪种方法从网页中提取表格更有效率?

    • 这取决于表格的大小和页面加载时间。如果表格很小且页面加载很快,使用 pandas 直接读取表格可能是更有效率的。如果表格很大或页面加载很慢,使用 Selenium 导航和提取表格可能是更可靠的方法。
  5. 如何处理具有多个表格的网页?

    • 使用 read_html() 函数指定要读取的特定表格索引。例如,table_df = pd.read_html(table_element.get_attribute('outerHTML'))[1] 将读取网页中的第二个表格。