
本文介绍如何利用 jsoup 库从 binding of isaac 维基页面(https://bindingofisaacrebirth.fandom.com/wiki/items)中自动提取物品表格数据,并结构化为 java 对象,适用于 android 项目中的列表展示。
本文介绍如何利用 jsoup 库从 binding of isaac 维基页面(https://bindingofisaacrebirth.fandom.com/wiki/items)中自动提取物品表格数据,并结构化为 java 对象,适用于 android 项目中的列表展示。
在 Android 开发中,若需将第三方网页中的结构化数据(如游戏道具表)动态加载为本地对象列表,手动复制粘贴显然不可持续。Jsoup 是一个功能强大且轻量的 Java HTML 解析库,特别适合处理真实世界中不规范但语义清晰的网页内容——例如 Fandom 维基站点。
以下是一个完整、可运行的解析方案,目标是将维基页中“Collectible Items”表格的六项字段(Name、Id、Icon、Quote、Description、Quality)准确抽取,并封装为 Item 实体类:
✅ 步骤一:添加依赖(Gradle)
在 app/build.gradle 中引入 Jsoup(注意 Android 9+ 默认禁用明文 HTTP,而该站点使用 HTTPS,无需额外配置):
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
implementation 'org.jsoup:jsoup:1.18.1'
⚠️ 注意:Android 中网络请求必须在子线程执行(如 AsyncTask、Coroutine 或 ExecutorService),禁止在主线程调用 Jsoup.connect().get(),否则抛出 NetworkOnMainThreadException。
✅ 步骤二:定义数据模型类
public class Item {
private String name;
private String id; // 原始为字符串格式如 "5.100.130",可按需转为 int 或保留
private String iconUrl;
private String quote;
private String description;
private int quality;
// 构造函数、getter/setter 略(建议使用 IDE 自动生成)
}
✅ 步骤三:核心解析逻辑(含健壮性增强)
原始示例仅提取前三列,但实际表格包含 Quote、Description 和 Quality 字段。经分析目标页面 HTML 结构,主表格中每行 .row-collectible 包含 6 个 优化后的解析代码(含异常防护与日志): 通过以上方案,你不仅能稳定获取全部 170+ 道具数据,还构建了可维护、可扩展的数据管道——为后续搜索、筛选、离线缓存等功能打下坚实基础。 单元格,对应字段顺序如下(以最新快照为准):
列索引
字段
提取说明
0
Name
cell.get(0).text()
1
Id
cell.get(1).text()
2
Icon
@@##@@ 的 data-src 属性(注意:部分图标可能无 data-src,需 fallback 到 src)
3
Quote
cell.get(3).text()(常含换行与多余空格,建议 trim().replaceAll("\s+", " "))
4
Description
cell.get(4).text()(同上,需清洗)
5
Quality
cell.get(5).text() → Integer.parseInt(...),需 try-catch
public List<item> parseItemsFromWiki() {
List<item> items = new ArrayList();
String url = "https://bindingofisaacrebirth.fandom.com/wiki/Items";
try {
Document doc = Jsoup.connect(url)
.userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
.timeout(10000)
.get();
Element table = doc.selectFirst("table"); // 或更精准:table[role=grid]
if (table == null) throw new IllegalStateException("Table not found");
Elements rows = table.select("tr.row-collectible");
Log.d("Jsoup", "Found " + rows.size() + " collectible rows");
for (Element row : rows) {
Elements cells = row.getElementsByTag("td");
if (cells.size() <h3>⚠️ 关键注意事项</h3>
<ul>
<li>
<strong>反爬策略</strong>:Fandom 可能对高频请求返回 403,务必设置 userAgent 并合理控制请求频率(生产环境建议加缓存或使用官方 API)。</li>
<li>
<strong>HTML 动态性</strong>:维基页面结构可能随编辑更新,建议定期验证选择器(如 .row-collectible 是否仍存在,或改用 table tbody tr + 内容特征判断)。</li>
<li>
<strong>图片加载</strong>:data-src 是懒加载属性,直接获取即可;Android 中推荐用 Glide/Picasso 加载 iconUrl。</li>
<li>
<strong>线程安全</strong>:该方法应在后台线程调用,解析完成后通过 Handler、LiveData 或 Coroutine 切回主线程更新 UI。</li>
</ul>
<h3>✅ 后续集成(Android 示例)</h3>
<pre class="brush:php;toolbar:false;">// 在 ViewModel 或 Repository 中调用
new Thread(() -> {
List<item> items = parseItemsFromWiki();
// 更新 LiveData 或通知 Adapter
itemLiveData.postValue(items);
}).start();</item>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










