使用JSoup解析HTML时如何过滤格式标签提取指定纯文本值
JSoup默认的解析器就会自动修正你提到的缺失闭合标签、嵌套顺序错误等畸形HTML问题,直接调用Jsoup.parse(待解析HTML字符串)即可得到结构正常的Document对象,不需要额外做兼容配置。
针对你需要提取标签后值的需求,有两种常用的实现方式:
方法1:节点定位提取(更可靠)
直接定位到td内的标签,读取它的下一个兄弟文本节点的内容,不会受值内包含冒号的场景影响,代码如下:
import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.jsoup.Jsoup; // 省略其他业务代码 Document document = Jsoup.parse(htmlContent); Material material = new Material(); // 直接选中内层的属性table,避免和外层table混淆 Elements propertyRows = document.select("table table tr"); for (Element row : propertyRows) { Elements cols = row.select("td"); // 处理当前行第一列 if (cols.size() >= 1) { Element col = cols.get(0); Element label = col.selectFirst("b"); String key = label.text().trim(); String value = label.nextSibling().toString().trim(); switch (key) { case "Origin:": material.setOrigin(value); break; case "Supplier:": material.setSupplier(value); break; case "Type:": material.setType(value); break; } } // 处理当前行第二列 if (cols.size() >= 2) { Element col = cols.get(1); Element label = col.selectFirst("b"); String key = label.text().trim(); String value = label.nextSibling().toString().trim(); switch (key) { case "Count:": material.setCount(value); break; case "Must Burninate:": material.setBurninate("Yes".equals(value)); break; case "Add Afterwards:": material.setAddAfterwards("Yes".equals(value)); break; } } } // 提取name字段 material.setName(document.selectFirst("h2").text().trim());
方法2:文本分割(更简洁)
如果你的场景下属性标签永远不会包含冒号,可以直接把td的全文本按冒号分割为两部分,取第二部分修剪后即可得到值:
// 替换掉原代码中取值的逻辑即可 String fullText = col.text(); String value = fullText.split(":", 2)[1].trim();
两种方法都可以兼容Supplier这种值为空的场景,不会抛出异常。
内容的提问来源于stack exchange,提问作者hotmeatballsoup
相关产品推荐
相关产品推荐

