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
相关产品推荐
相关产品推荐

