我很难获得正确的输出。请参阅以下来自 HTML 的示例文本:
<p><span class="v">1</span> Een psalm van David. De HEERE is mijn Herder, mij zal niets ontbreken.</p>
<p><span class="v">2</span> Hij doet mij nederliggen in grazige weiden; Hij voert mij zachtjes aan zeer stille wateren.</p>
<p><span class="v">3</span> Hij verkwikt mijn ziel; Hij leidt mij in het spoor der gerechtigheid, om Zijns Naams wil.</p>
我想获取 paragraph
的值,即 Een psalm van David。 De HEERE is mijn Herder, mij zal niets ontbreken. 基于用户选择的verse
到目前为止,这是我所做的:
HttpGet get = new HttpGet(url);
HttpResponse resp = client.execute(get);
String content = EntityUtils.toString(resp.getEntity());
Document doc = Jsoup.parse(content);
StringBuilder sb = new StringBuilder();
Elements passage = doc.select("p > span.v");
sb.append(passage.text() + "\n");
Elements links = doc.select(className);
for (Element link : links) {
sb.append(link.text() + " ");
}
Log.e("ELEMENTS", "" + sb.toString());
response = sb.toString();
但我只得到了诗句编号。如何获得正确的输出?我很乐意提供任何帮助。谢谢。
最佳答案
假设你想获取第 1
节的段落,你可以使用:
:has(selector)
只获取包含与选择器匹配的元素的元素- 然后用作选择器
span.v:containsOwn(1)
以指示您想要v
类的span
其text
包含1
。 - 最后使用
ownText()
获取元素本身的文本而不是其子元素的文本,否则如果您想要两者都使用text()
。
所以代码可以是:
String className = "v";
int verse = 1;
Element p = doc.select(String.format("p:has(span.%s:containsOwn(%d))", className, verse))
.first();
System.out.println(p.ownText());
输出:
Een psalm van David. De HEERE is mijn Herder, mij zal niets ontbreken.
如果要获取所有段落的内容,代码可以是:
StringBuilder sb = new StringBuilder();
Elements paragraphs = doc.select("p:has(span.v)");
for (Element p : paragraphs) {
sb.append(p.ownText() + "\n");
}
System.out.println(sb);
输出:
Een psalm van David. De HEERE is mijn Herder, mij zal niets ontbreken.
Hij doet mij nederliggen in grazige weiden; Hij voert mij zachtjes aan zeer stille wateren.
Hij verkwikt mijn ziel; Hij leidt mij in het spoor der gerechtigheid, om Zijns Naams wil.
关于java - JSOUP 从 p 和 span 中抓取 html 文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40522752/