【问题标题】:Formatting issue with HTML while using JSoup for Java使用 JSoup for Java 时出现 HTML 格式问题
【发布时间】:2015-12-05 05:13:27
【问题描述】:

我正在尝试使用 JSoup 从网站上抓取“文本”。我可以清晰地获取文本(根本没有格式,只有文本),或者仍然附加所有格式(即
以及

)。

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

例如,我可以得到这个:

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

还有这个:

Worldwide database

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

Worldwide database<br/>

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

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

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 的网址?

标签: java html web-scraping jsoup screen-scraping


【解决方案1】:

HTML 没有为&lt;br&gt; 元素定义结束标记。然而,XHTML 要求将标记标记为空:&lt;br /&gt;。 JSoup 解析两者,但只会打印出普通的 HTML (&lt;br&gt;)。

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

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

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多