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

Python爬虫无法提取含"deed"的文档链接,求修复方案

XPath修复与代码优化方案

一、核心XPath问题分析与修复思路

原代码的XPath未按注释要求限定第4列,且未处理文本大小写、空白字符及子元素文本的情况,导致无法匹配目标行。修复步骤如下:

  • 限定目标列:明确指定第4列的<td>节点,将XPath中的td改为td[4],确保只检查第4列内容
  • 忽略大小写:用translate()函数统一文本大小写,避免因大小写差异漏匹配
  • 处理空白字符:通过normalize-space()去除文本中的换行、多余空格,确保匹配准确性
  • 匹配节点全量文本:用.代替text(),可匹配当前节点及所有子元素的文本内容(解决"deed"在子元素中的情况)

修复后的XPath示例:

//table[@id="f"]//tr[td[4][contains(normalize-space(translate(., 'DEED', 'deed')), 'deed')]]

二、验证XPath有效性

在浏览器开发者工具控制台执行以下代码,确认能否定位到目标行:

$x('//table[@id="f"]//tr[td[4][contains(normalize-space(.), "deed")]]')

若返回非空数组,说明XPath逻辑正确;若为空,需检查表格结构是否嵌套、列索引是否正确(XPath索引从1开始)。

三、优化后的完整代码

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
import requests
import os

# 初始化浏览器
driver = webdriver.Chrome()
driver.get("目标网站URL")

# 此处需补充搜索输入与提交的代码(已确认可正常执行)

# 创建保存目录
download_dir = "deed_documents"
os.makedirs(download_dir, exist_ok=True)

while True:
    try:
        # 等待表格加载完成
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "f"))
        )
        
        # 用修复后的XPath定位目标行
        row_elements = driver.find_elements(
            by=By.XPATH,
            value='//table[@id="f"]//tr[td[4][contains(normalize-space(translate(., "DEED", "deed")), "deed")]]'
        )
        
        if not row_elements:
            print("当前页无匹配文档,退出循环")
            break
            
        # 提取有效链接
        links = []
        for row in row_elements:
            try:
                link = row.find_element(by=By.XPATH, value='.//td[1]/a').get_attribute("href")
                if link:
                    links.append(link)
            except Exception as e:
                print(f"提取链接失败: {e}")
                continue
        
        print(f"当前页找到 {len(links)} 个目标链接")
        
        # 下载并保存PDF
        for idx, link in enumerate(links, 1):
            try:
                response = requests.get(link, stream=True)
                response.raise_for_status()
                
                pdf_path = os.path.join(download_dir, f"deed_doc_{idx}.pdf")
                with open(pdf_path, "wb") as f:
                    for chunk in response.iter_content(chunk_size=8192):
                        f.write(chunk)
                print(f"已保存: {pdf_path}")
                
            except Exception as e:
                print(f"下载链接 {link} 失败: {e}")
                continue
        
        # 处理分页(需根据实际页面调整下一页按钮的定位)
        try:
            next_page_btn = driver.find_element(by=By.XPATH, value='//a[contains(text(), "下一页")]')
            if next_page_btn.is_enabled() and next_page_btn.is_displayed():
                next_page_btn.click()
                WebDriverWait(driver, 10).until(EC.staleness_of(row_elements[0]))
            else:
                print("已到最后一页,退出循环")
                break
        except Exception as e:
            print("未找到下一页按钮或已到最后一页")
            break
            
    except Exception as e:
        print(f"循环出错: {e}")
        break

# 关闭浏览器
driver.quit()

四、关键优化说明

  • 等待机制:用WebDriverWait替代强制等待,确保元素加载完成后再操作
  • 错误处理:增加try-except块,避免单个链接处理失败导致程序崩溃
  • 分页逻辑:补充分页遍历,支持抓取所有页面的目标文档
  • 文件管理:创建单独目录存储PDF,避免文件混乱

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:30:21