使用Playwright+BeautifulSoup提取DreamBot JavaDocs类名失败求助
问题描述
我正在编写Python爬虫,采用Playwright和BeautifulSoup解析DreamBot API的JavaDoc页面(示例页面:https://dreambot.org/javadocs/org/dreambot/api/methods/container/impl/bank/Bank.html),目标是提取类/接口/枚举的名称、类型及可选的父类和接口信息。
当前尝试通过<h2>标签或顶部<pre>声明块提取类名,但无论测试哪个页面,结果始终返回"name": "[Unnamed]"。我已经尝试过抓取.header、.contentContainer等区域、标准化空白、使用替代选择器及打印完整HTML,均未解决问题。
现求助两个问题:
- 提取DreamBot JavaDocs类名的更可靠方法;
- DreamBot的类/接口/枚举页面是否结构一致?
解决方案
1. 更可靠的类名提取方法
查看DreamBot JavaDoc页面的结构,类/接口/枚举的核心信息集中在页面顶部的**.header区域**,可以通过以下两种方式稳定提取:
- 直接从
<h1>标签提取类名(含完整包路径):# 假设soup是BeautifulSoup解析后的对象 full_class_name = soup.select_one('div.header h1').get_text(strip=True) # 若只需要单纯类名(去掉包路径),按最后一个点分割即可 pure_class_name = full_class_name.split('.')[-1] - 从
<pre class="signature">标签提取完整签名信息(包含类型、父类/接口):signature_pre = soup.select_one('pre.signature') if signature_pre: signature_text = signature_pre.get_text(strip=True) # 示例签名文本:public class Bank extends Container implements ContainerMethods, ItemContainer parts = signature_text.split() type_ = parts[1] # 取值为class/interface/enum class_name = parts[2] # 提取父类和接口 parent_class = None interfaces = [] extends_pos = signature_text.find('extends') implements_pos = signature_text.find('implements') if extends_pos != -1: end_idx = implements_pos if implements_pos != -1 else len(signature_text) parent_class = signature_text[extends_pos+7:end_idx].strip() if implements_pos != -1: interfaces = [i.strip() for i in signature_text[implements_pos+10:].split(',')]
另外,用Playwright时要确保页面完全加载后再解析,避免因元素未渲染导致抓取失败:
await page.wait_for_selector('div.header') html = await page.content() soup = BeautifulSoup(html, 'html.parser')
2. 页面结构一致性
DreamBot的JavaDoc页面是标准化生成的,类、接口、枚举页面的核心结构完全一致,统一包含:
- 顶部
.header块,内含<h1>类名和<pre>签名区域 - 下方
.contentContainer承载详细文档内容 - 侧边栏导航结构统一
你可以使用一套选择器处理所有这类页面,无需针对不同类型做特殊适配。
内容的提问来源于stack exchange,提问作者Nunyobiz
相关产品推荐
相关产品推荐

