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>
不幸的是,它實際上有點格式錯誤(缺少一些結束標簽、開始和結束標簽<b>以及<u>亂序等)但我希望 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從決議中提供一個實體。
要獲取<table>我非常接近的資料:
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(???);
}
}
所以我能夠得到每個<tr>,并且為每個<tr>得到它的所有列<td>。但我掛斷的地方是:
<td align="left"><b>Origin:</b> Belgium</td>
所以col.text()第一個<td>是<b>Origin:</b> Belgium. 我如何告訴 JSoup 我只想要“比利時”?
uj5u.com熱心網友回復:
我想你正在尋找tdNode.ownText(). 還有簡單的text(),但正如檔案所述,這結合了節點的所有文本節點及其所有子節點并對其進行規范化。換句話說,tdNode.text()給你字串"Origin: Belgium"。tdNode.ownText()給你公正"Belgium",tdNode.child(0).ownText()讓你公正"Origin:"。
您也可以使用wholeText(),這是非規范化的,但我認為您希望在這里進行規范化(主要涉及去除空格)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/367768.html
