JSoup 从不包含任何 html 节点的 table std 中提取文本
JSoup extract the text from the table td which doesnt contains any html nodes
我有一个像这样的 html 字符串:
String html="<table><tbody>
<tr>
<td><p>ABC</p></td>
<td>DEF</td>
</tr>
<tr>
<td><p>GHI</p></td>
<td>MNO</td>
</tr>
</tbody>
</table>";
我只需要提取里面没有更多子元素的文本 td tags.My 当前代码 returns me both text and html 个节点。
Elements elements = doc.select("tbody > tr");
for (Element e : elements) {
System.out.println(e.select("td").html());
}
但我需要的输出是:
DEF
MNO
提前致谢。
尝试 Element.child(int index)
和 index = 0
。
Elements elements = doc.select("tbody > tr");
for (Element e : elements) {
for (Element el : e.select("td")) {
// el.child(0)
}
}
我不清楚,如果你想要的只是每个 td
的文本而不是那个 td
的 child 的端口,或者如果你想要进一步排除所有具有 children 的 tds。因此,您可能需要稍微调整一下我的解决方案。
String html="<table><tbody>"
+"<tr>"
+"<td><p>ABC</p></td>"
+"<td>DEF</td>"
+"<td>DEF2<p>ABC</p></td>"
+"</tr>"
+"<tr>"
+"<td><p>GHI</p></td>"
+"<td>MNO</td>"
+"<td>MNO2<p>GHI2</p></td>"
+"</tr>"
+"</tbody>"
+"</table>";
Document doc = Jsoup.parse(html);
Elements elements = doc.select("tbody > tr > td:matchesOwn(.+)");
for (Element e : elements) {
System.out.println(e.text());
}
上述解决方案查找具有任何自己文本的 td 元素,即匹配正则表达式 .+
(至少一个字符)的元素。
如果想进一步剔除含有children的tds,可以这样做:
Document doc = Jsoup.parse(html);
Elements elements = doc.select("tbody > tr > td:matchesOwn(.+):not(:has(*))");
for (Element e : elements) {
System.out.println(e.text());
}
这同时使用了 :has()
和 :not()
伪选择器,如 JSOUP Docs
中所述
试试这个 CSS 选择器:
tbody > tr > td:not(:has(*))
演示
http://try.jsoup.org/~K4qiK0SxQDeuhE9FvvmUDa3vKKI
描述
tbody /* Select any tbody */
> tr /* Select any tr directly under it */
> td /* Select any td directly under it ... */
:not(:has(*)) /* ... not having any element */
*
运算符仅匹配 元素 。文本节点不是元素。它只是一种节点。
示例代码
Elements elements = doc.select("tbody > tr > td:not(:has(*))");
for (Element e : elements) {
System.out.println(e.select("td").html());
}
输出
<td>DEF</td>
<td>MNO</td>
我有一个像这样的 html 字符串:
String html="<table><tbody>
<tr>
<td><p>ABC</p></td>
<td>DEF</td>
</tr>
<tr>
<td><p>GHI</p></td>
<td>MNO</td>
</tr>
</tbody>
</table>";
我只需要提取里面没有更多子元素的文本 td tags.My 当前代码 returns me both text and html 个节点。
Elements elements = doc.select("tbody > tr");
for (Element e : elements) {
System.out.println(e.select("td").html());
}
但我需要的输出是:
DEF
MNO
提前致谢。
尝试 Element.child(int index)
和 index = 0
。
Elements elements = doc.select("tbody > tr");
for (Element e : elements) {
for (Element el : e.select("td")) {
// el.child(0)
}
}
我不清楚,如果你想要的只是每个 td
的文本而不是那个 td
的 child 的端口,或者如果你想要进一步排除所有具有 children 的 tds。因此,您可能需要稍微调整一下我的解决方案。
String html="<table><tbody>"
+"<tr>"
+"<td><p>ABC</p></td>"
+"<td>DEF</td>"
+"<td>DEF2<p>ABC</p></td>"
+"</tr>"
+"<tr>"
+"<td><p>GHI</p></td>"
+"<td>MNO</td>"
+"<td>MNO2<p>GHI2</p></td>"
+"</tr>"
+"</tbody>"
+"</table>";
Document doc = Jsoup.parse(html);
Elements elements = doc.select("tbody > tr > td:matchesOwn(.+)");
for (Element e : elements) {
System.out.println(e.text());
}
上述解决方案查找具有任何自己文本的 td 元素,即匹配正则表达式 .+
(至少一个字符)的元素。
如果想进一步剔除含有children的tds,可以这样做:
Document doc = Jsoup.parse(html);
Elements elements = doc.select("tbody > tr > td:matchesOwn(.+):not(:has(*))");
for (Element e : elements) {
System.out.println(e.text());
}
这同时使用了 :has()
和 :not()
伪选择器,如 JSOUP Docs
试试这个 CSS 选择器:
tbody > tr > td:not(:has(*))
演示
http://try.jsoup.org/~K4qiK0SxQDeuhE9FvvmUDa3vKKI
描述
tbody /* Select any tbody */
> tr /* Select any tr directly under it */
> td /* Select any td directly under it ... */
:not(:has(*)) /* ... not having any element */
*
运算符仅匹配 元素 。文本节点不是元素。它只是一种节点。
示例代码
Elements elements = doc.select("tbody > tr > td:not(:has(*))");
for (Element e : elements) {
System.out.println(e.select("td").html());
}
输出
<td>DEF</td>
<td>MNO</td>