在 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);
我正在尝试使用 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);