【问题标题】:Filtering out formatting tags from JSoup selectors从 JSoup 选择器中过滤掉格式化标签
【发布时间】:2022-01-05 04:20:17
【问题描述】:

JSoup 在这里。我有以下要解析的 HTML:

<html><head>
<title>My Soup Materials</title>
<!--mstheme--><link rel="stylesheet" type="text/css" href="../../_themes/ice/ice1011.css"><meta name="Microsoft Theme" content="ice 1011, default">
</head>
<body><center><table width="92%"><tbody>
<tr>
<td><h2>My Soup Materials</h2>

<table width="100%%" cellspacing="0" cellpadding="0">

<tbody>
<tr>
<td align="left"><b>Origin:</b> Belgium</td>
<td align="left"><b>Count:</b> 2 foos</td>
</tr>

<tr>
<td align="left"><b>Supplier:</b> </td>
<td align="left"><b>Must Burninate:</b> Yes</td>
</tr>

<tr>
<td align="left"><b>Type:</b> Fizzbuzz</td>
<td align="left"><b>Add Afterwards:</b> No</td>
</tr>

</tbody>
</table>
<br>
<b><u>Notes</b></u><br>Drink more ovaltine</td>
</tr>

</tbody>
</table>
</center></body>
</html>

不幸的是,它实际上有点格式错误(缺少一些结束标签,&lt;b&gt; 和 &lt;u&gt; 上的开始和结束标签出现故障等)但我希望 JSoup 可以处理这个问题。我无法控制 HTML。

我有以下 Java 模型/POJO:

@Data // lombok; adds ctors, getters, setters, etc.
public class Material {
  private String name;
  private String origin;
  private String count;
  private String supplier;
  private Boolean burninate;
  private String type;
  private Boolean addAfterwards;
}

我正在尝试让 JSoup 解析此 HTML 并从该解析中提供一个 Material 实例。

要获取&lt;table&gt; 中的数据,我已经很接近了:

Material material = new Material();

Elements rows = document.select("table").select("tr");
for (Element row : rows) {

    // row 1: origin & count
    Elements cols = row.select("td");
    for (Element col : cols) {
        material.setOrigin(???);
        material.setCount(???);
    }

}

所以我能够获取每个&lt;tr&gt;,并且对于每个&lt;tr&gt;,获取其所有&lt;td&gt; 列。但我挂断电话的是:

<td align="left"><b>Origin:</b> Belgium</td>

所以第一个&lt;td&gt; 的col.text() 将是&lt;b&gt;Origin:&lt;/b&gt; Belgium。 如何告诉 JSoup 我只想要“比利时”?

【问题讨论】:

    标签: java html css-selectors jsoup


    【解决方案1】:

    我认为您正在寻找tdNode.ownText()。还有简单的text(),但as the docs state 结合了节点及其所有子节点 的所有文本节点并将它们标准化。换句话说,tdNode.text() 给你字符串"Origin: Belgium"。 tdNode.ownText() 只给你"Belgium",tdNode.child(0).ownText() 只给你"Origin:"。

    您也可以使用wholeText(),它是非规范化的,但我认为您希望在这里进行规范化(主要涉及去除空白)。

    【讨论】:

      猜你喜欢
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      相关资源
      最近更新 更多