在 Java 中使用 JSoup 时 HTML 出现格式问题

Formatting issue with HTML while using JSoup for Java

我正在尝试使用 JSoup 从网站上抓取 "text"。我可以获得干净的文本(完全没有格式,只有文本),或者仍然附加所有格式(即
以及

和 < /p >)。

但是,我似乎无法让格式化版本在任何程度上包含
,这是唯一特别要求与文本一起使用的内容。

例如,我可以得到这个:

<p><br>Worldwide database</p>

还有这个:

Worldwide database

但我无法得到这个,这是我想要的结果:

Worldwide database<br/>

我在通过 Firefox 上的 FireBug 插件查看 HTML 代码时没有看到任何 < br />,所以我想知道这是否可能是问题所在?或者我在代码中使用的提取文本的方法可能有问题?

无论如何,这是我的代码:

Elements descriptionHTML = doc.select("div[jsname]"); // <-- Get access to the text w/ JSoup
String descText = descriptionHTML.text(); // <-- Get the code w/o any formating at all

// This prints out the desired text with the <p><br> and </p>, but no <br/>
for (Element link : descriptionHTML) 
{
   String jsname = link.attr("jsname");
   if( jsname.equals("C4s9Ed")){                    
        System.out.println(link);
        break;
   }                                        
}

我真的很感激任何帮助解决这个问题。

谢谢, 杰克

HTML 没有为 <br> 元素定义结束标记。然而,XHTML 要求标签标记为空:<br />。 JSoup 解析两者,但只会打印出正常的 HTML (<br>).

如果您在 Jsoup 中使用 XML 解析器,<br> 标签不会关闭,因此 Jsoup 会尝试猜测在哪里放置匹配的结束标签 </br>,这些标签既不是 HTML 也不符合 XHTML。

如果您想保留换行符信息并去除所有其他标签,我认为您需要在 Jsoup 之外对该部分进行编程。例如,您可以将所有 <br><br /> 字符串替换为唯一的其他字符串,例如 "_brSplitPos_",然后使用 JSoup 解析文档,仅打印出文本并替换 "_brSplitPos_" 反对 <br />:

String html = "<div>This<br>is<br />a<br>test</div>";
html = html.replaceAll("<br(?:\s+/)?>", "_brSplitPos_");
Document docH = Jsoup.parse(html);
String onlyText = docH.text();
onlyText = onlyText.replace("_brSplitPos_", "<br />");
System.out.println(onlyText);