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

使用XPath与BeautifulSoup提取嵌套链接失败,求解决方案

问题与解决方案

需求说明

需要提取页面中XPath为/html/body/div[1]/div[2]/div[1]/div/div/div/div/div/a的嵌套链接,同时要根据同级<p>标签内的文本(如“18 may 2024”)过滤链接,该p标签无固定ID。

错误原因分析

第一种代码错误

混淆了BeautifulSoup与Selenium的API:soup是BeautifulSoup解析后的对象,并不具备Selenium的find_element_by_xpath方法,调用该方法时会返回None,进而触发TypeError: 'NoneType' object is not callable。

第二种代码错误

soup('a')返回的是ResultSet对象(类似列表),无法通过('div')直接调用;同时链式索引的方式完全不符合BeautifulSoup的元素查找逻辑,导致报错TypeError: 'ResultSet' object is not callable。

可复用解决方案

方案一:纯Selenium实现(适配动态页面)

Selenium可以处理页面动态加载,同时直接关联日期与对应链接:

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

# 初始化浏览器
browser = webdriver.Chrome()
browser.get('https://www.visionias.in/resources/daily_current_affairs_programs.php?type=1&m=05&y=2024')

try:
    # 等待页面核心容器加载完成
    wait = WebDriverWait(browser, 10)
    containers = wait.until(EC.presence_of_all_elements_located((By.XPATH, '/html/body/div[1]/div[2]/div[1]/div/div')))
    
    target_date = "18 may 2024"
    matching_links = []
    
    for container in containers:
        # 获取日期文本
        date_elem = container.find_element(By.TAG_NAME, 'p')
        date_text = date_elem.text.strip().lower()
        
        # 过滤目标日期的链接
        if target_date in date_text:
            link_elem = container.find_element(By.XPATH, './/div/div/div/div/a')
            full_href = link_elem.get_attribute('href')
            relative_href = full_href.split('visionias.in')[-1] if 'visionias.in' in full_href else full_href
            matching_links.append({
                "date": date_text,
                "full_link": full_href,
                "relative_link": relative_href
            })
    
    # 输出结果
    for item in matching_links:
        print(f"日期: {item['date']}")
        print(f"完整链接: {item['full_link']}")
        print(f"相对链接: {item['relative_link']}\n")
        
finally:
    browser.quit()

关键说明:

  • 用WebDriverWait等待元素加载,避免页面未渲染完成就查找元素
  • 通过父容器关联日期与链接,确保过滤逻辑准确
  • 用相对XPath(.//)在父容器内查找子元素,避免绝对XPath因页面结构变动失效
  • 统一转小写处理日期文本,避免大小写匹配问题

方案二:Selenium+BeautifulSoup实现(静态内容解析更灵活)

先通过Selenium获取页面源码,再用BeautifulSoup做静态解析:

from selenium import webdriver
from bs4 import BeautifulSoup

browser = webdriver.Chrome()
browser.get('https://www.visionias.in/resources/daily_current_affairs_programs.php?type=1&m=05&y=2024')

# 解析页面源码
soup = BeautifulSoup(browser.page_source, 'html.parser')
browser.quit()

target_date = "18 may 2024"
matching_links = []

# 定位所有包含日期与链接的父容器
containers = soup.select('div:nth-child(2) > div:nth-child(1) > div > div')

for container in containers:
    date_p = container.find('p')
    if not date_p:
        continue
    
    date_text = date_p.get_text(strip=True).lower()
    if target_date in date_text:
        # 查找目标链接
        link_a = container.select_one('div > div > div > div > a')
        if link_a and 'href' in link_a.attrs:
            full_href = link_a['href']
            relative_href = full_href.split('visionias.in')[-1] if 'visionias.in' in full_href else full_href
            matching_links.append({
                "date": date_text,
                "full_link": full_href,
                "relative_link": relative_href
            })

# 输出结果
for item in matching_links:
    print(f"日期: {item['date']}")
    print(f"完整链接: {item['full_link']}")
    print(f"相对链接: {item['relative_link']}\n")

关键说明:

  • 用BeautifulSoup的CSS选择器(.select()/.select_one())替代易失效的绝对XPath
  • 检查a标签的href属性是否存在,避免空值报错
  • 解析完成后立即关闭浏览器,节省资源

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 18:52:05