
在使用selenium进行网页自动化时,driver.find_elements()方法是定位页面上多个元素的核心。它会返回一个webelement对象的列表,每个对象都代表页面上一个匹配到的html元素。仅仅打印这个列表只会显示webelement对象的内存地址或会话id,并不能直接展示元素的实际内容。要获取这些元素内部的信息,我们需要进一步操作这些webelement对象。
获取WebElement列表后,最常见的操作是遍历这个列表,对每个元素进行单独处理。在遍历过程中,我们可以使用WebElement对象提供的多种方法来提取信息。
element.text属性可以获取元素及其所有子元素的可见文本内容。这对于获取段落、链接文本、按钮文字等非常有用。
element.get_attribute(attribute_name)方法可以获取指定属性的值,例如class、id、href、src等。这对于提取非文本信息,如链接地址、图片路径或自定义数据属性非常关键。
以下是一个基础的示例代码,演示如何遍历元素并提取其类名和可见文本:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options as ChromeOptions
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 配置Chrome选项
chrome_options = ChromeOptions()
chrome_options.page_load_strategy = 'normal'
# 如果不需要扩展,可以移除或注释掉此行
# chrome_options.add_extension('cs2float.crx')
driver = webdriver.Chrome(options=chrome_options)
try:
driver.get('https://steamcommunity.com/market/listings/730/AWP%20%7C%20Safari%20Mesh%20%28Field-Tested%29?filter=')
# 等待页面加载完成,确保元素可见
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "market_listing_row"))
)
# 查找所有类名为 "market_listing_row" 的元素
s = driver.find_elements(By.CLASS_NAME, "market_listing_row")
print(f"找到 {len(s)} 个市场列表行元素。")
# 遍历每个元素并打印其类名和可见文本
for i, element in enumerate(s):
print(f"\n--- 元素 {i+1} ---")
print(f"类属性: {element.get_attribute('class')}")
print(f"可见文本: \n{element.text}")
except Exception as e:
print(f"发生错误: {e}")
finally:
driver.quit()在实际应用中,我们往往需要从复杂结构中提取更具体的数据,例如商品列表中的价格和浮动值。这些信息通常嵌套在父元素(如market_listing_row)的子元素中。要获取这些数据,我们需要在遍历每个父WebElement时,在其内部再次使用find_element()或find_elements()方法来定位子元素。
假设一个市场列表行(market_listing_row)的HTML结构大致如下:
<div class="market_listing_row">
<div class="market_listing_item_name">AWP | Safari Mesh (Field-Tested)</div>
<div class="market_listing_price">
<span class="market_listing_price_with_fee">$1.23</span>
<!-- 可能还有其他价格信息 -->
</div>
<div class="market_listing_float_value">
<span>Float: 0.123456</span>
</div>
<!-- 其他信息 -->
</div>我们可以通过以下步骤提取价格和浮动值:
以下是实现此功能的示例代码:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options as ChromeOptions
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
# 配置Chrome选项
chrome_options = ChromeOptions()
chrome_options.page_load_strategy = 'normal'
# chrome_options.add_extension('cs2float.crx') # 如果不需要扩展,可以移除或注释掉此行
chrome_options.add_argument("--headless") # 无头模式运行,不显示浏览器界面
chrome_options.add_argument("--disable-gpu") # 禁用GPU加速,在无头模式下有时需要
chrome_options.add_argument("--window-size=1920,1080") # 设置窗口大小,避免一些响应式布局问题
driver = webdriver.Chrome(options=chrome_options)
try:
url = 'https://steamcommunity.com/market/listings/730/AWP%20%7C%20Safari%20Mesh%20%28Field-Tested%29?filter='
driver.get(url)
# 显式等待,直到市场列表行元素出现
WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.CLASS_NAME, "market_listing_row"))
)
# 查找所有市场列表行
listing_rows = driver.find_elements(By.CLASS_NAME, "market_listing_row")
print(f"找到 {len(listing_rows)} 个市场列表项。")
extracted_data = []
for i, row_element in enumerate(listing_rows):
item_name = "N/A"
item_price = "N/A"
item_float = "N/A"
try:
# 尝试从当前行元素中查找物品名称
name_element = row_element.find_element(By.CLASS_NAME, "market_listing_item_name")
item_name = name_element.text.strip()
except NoSuchElementException:
pass # 元素不存在则跳过
try:
# 尝试从当前行元素中查找价格
# 注意:这里可能需要根据实际页面结构调整定位器
price_element = row_element.find_element(By.CSS_SELECTOR, ".market_listing_price span.market_listing_price_with_fee")
item_price = price_element.text.strip()
except NoSuchElementException:
# 如果找不到带fee的价格,尝试找不带fee的
try:
price_element = row_element.find_element(By.CLASS_NAME, "market_listing_price")
item_price = price_element.text.strip()
except NoSuchElementException:
pass
try:
# 尝试从当前行元素中查找浮动值
# 浮动值通常在一个特定的扩展或脚本注入的元素中,可能没有标准类名
# 这里假设浮动值在一个带有特定类名或数据属性的元素中,例如 "market_listing_float_value"
# 或者,如果浮动值是扩展注入的,它可能在某个`span`或`div`中
# 需要根据实际页面HTML结构进行调整。
# 假设浮动值在一个class为'csfloat_float_value'的span中
float_element = row_element.find_element(By.CSS_SELECTOR, ".market_listing_float_value span")
item_float = float_element.text.replace("Float: ", "").strip()
except NoSuchElementException:
# 如果找不到特定浮动值元素,尝试从整个行文本中提取(如果浮动值直接可见)
# 或者,如果浮动值是扩展注入的,可能需要更复杂的定位策略或等待
pass
extracted_data.append({
"名称": item_name,
"价格": item_price,
"浮动值": item_float
})
# 打印提取到的数据
for item in extracted_data:
print(f"名称: {item['名称']}, 价格: {item['价格']}, 浮动值: {item['浮动值']}")
except Exception as e:
print(f"在处理页面时发生错误: {e}")
finally:
driver.quit()重要提示:
通过Selenium WebDriver从网页元素中提取信息是一个多步骤的过程,涉及元素的定位、遍历以及利用WebElement对象的各种方法。掌握如何结合find_elements()、.text、.get_attribute()以及在父元素内部定位子元素的技术,能够有效地从复杂网页中抓取所需数据。同时,遵循最佳实践,如使用显式等待和适当的异常处理,可以使您的自动化脚本更加健壮和高效。
以上就是Selenium WebDriver元素信息提取指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号