You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python的Beautiful Soup抓取petango.com的span标签文本

解决Petango宠物信息抓取的动态渲染问题

我来帮你解决这个问题——你遇到的核心问题是页面采用了Knockout.js动态渲染数据,静态HTML源码里并没有填充好你要的<span data-bind="text: breed">文本,所以直接用BeautifulSoup解析初始page_source会拿不到内容,或者拿到未渲染的结构。下面给你两种针对性的解决方案:

方案1:直接抓取目标span的文本(用Selenium等待动态加载)

因为目标内容是动态绑定的,我们需要用Selenium等待元素完全渲染后再获取文本,而不是直接解析静态源码。步骤如下:

  1. 导入Selenium的必要模块,包括等待元素加载的WebDriverWait
  2. 初始化浏览器,打开目标页面
  3. 等待目标span元素出现后,直接获取其文本

示例代码:

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

# 初始化浏览器(这里用Chrome,你也可以换成Firefox等)
driver = webdriver.Chrome()
driver.get("https://www.petango.com/Adopt/Dog-Terrier-Rat-22192827")

try:
    # 等待目标span加载完成,最多等待10秒
    breed_element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, 'span[data-bind="text: breed"]'))
    )
    # 获取并清理文本内容
    breed_text = breed_element.text.strip()
    print(f"宠物品种: {breed_text}")
finally:
    # 关闭浏览器
    driver.quit()

方案2:将所有详情解析为可赋值的变量(存入字典)

如果你想把Age、Breed等所有详情都解析成单独的变量,可以先定位到详情列表的ul元素,遍历每个li,拆分键值对存入字典,之后就能直接通过键名获取对应值。

示例代码:

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()
driver.get("https://www.petango.com/Adopt/Dog-Terrier-Rat-22192827")

try:
    # 等待详情列表加载完成
    details_ul = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, 'ul.group.details-list'))
    )
    # 获取所有li元素
    detail_items = details_ul.find_elements(By.TAG_NAME, 'li')
    
    # 初始化字典存储宠物信息
    pet_info = {}
    for item in detail_items:
        item_text = item.text.strip()
        # 拆分键和值,只拆分第一个冒号(避免值里有冒号的情况)
        if ': ' in item_text:
            key, value = item_text.split(': ', 1)
            pet_info[key] = value.strip()
    
    # 现在可以直接通过键名获取对应变量
    print(f"品种: {pet_info['Breed']}")
    print(f"年龄: {pet_info['Age']}")
    print(f"性别: {pet_info['Gender']}")
    # 其他字段同理
finally:
    driver.quit()

为什么之前的方法失效?

你之前用BeautifulSoup直接解析page_source,拿到的是页面初始加载的静态HTML,而Knockout.js会在页面加载完成后,通过JavaScript动态将数据绑定到对应的元素上。所以静态源码里的<span data-bind="text: breed">还没有填充实际文本,导致BeautifulSoup拿不到内容;而Selenium的find_element方法是从浏览器当前渲染好的DOM中获取元素,所以能拿到正确的文本内容。

内容的提问来源于stack exchange,提问作者pauliec

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 13:42:33