9

最後のリリース 1.7.2 を含む JSoup を使用すると、タグが閉じられていない無効なHTML を解析するバグがあります。

例:

String tmp = "<a href='www.google.com'>Link<p>Error link</a>";
Jsoup.parse(tmp);

生成するドキュメントは次のとおりです。

<html>
 <head></head>
 <body>
  <a href="www.google.com">Link</a>
  <p><a>Error link</a></p>
 </body>
</html>

ブラウザーは次のようなものを生成します。

<html>
 <head></head>
 <body>
  <a href="www.google.com">Link</a>
  <p><a href="www.google.com">Error link</a></p>
 </body>
</html>

Jsoup は、ブラウザーまたはソース コードとして動作する必要があります。

解決策はありますか?API を調べたところ、何も見つかりませんでした。

4

3 に答える 3

6

正しい動作は、この無効な HTML を解析するときに他のブラウザーとして機能することです。このバグを報告していただきありがとうございます。養子縁組機関が元の属性を新しいノードに保持することを妨げていた問題を修正しました。1.7.3 で利用可能になるか、今すぐ最初からビルドできます。

于 2013-10-06T23:23:00.037 に答える
2

ブラウザーが生成するようなソース コードを取得することが目的の場合は、selenium を使用し、それを Jsoup に渡して解析することができます。しかし、セレンは実際のブラウザを開く必要があり、もちろん自動的に開くことができます。次のようなコード:

public static void main(String[] args) {

    //System.setProperty("webdriver.chrome.driver", "./chromedriver.exe");
    //WebDriver driver = new ChromeDriver();
    WebDriver driver = new FirefoxDriver();
    driver.get("file:///C:/Users/jgong/Desktop/a.html");

    String html = driver.getPageSource();
    System.out.println(html);
    driver.quit();
    Document doc = Jsoup.parse(html);
    System.out.println(doc.html());

}

a.html は次のとおりです。

<html><head></head><body><a href="www.google.com">Link<p>Error link</a></body></html>

結果はあなたが望んでいたものです:

<html><head></head> <body> <a href="www.google.com">Link</a><p><ahref="www.google.com">Error link</a> </p></body></html>
于 2013-09-12T02:27:53.400 に答える
-1

あなたの HTML は無効です

文書タイプは、ここで要素「P」を許可しません。「APPLET」、「OBJECT」、「MAP」、「IFRAME」、「BUTTON」開始タグのいずれかが欠落しています

<a href='www.google.com'>Link<p>Error link</a>

言及された要素は、それを配置したコンテキストでは表示できません。他の言及された要素は、そこで許可され、言及された要素を含むことができる唯一のものです。これは、包含要素が必要であるか、前の要素を閉じるのを忘れている可能性があることを意味している可能性があります。

このメッセージの考えられる原因の 1 つは、ブロック レベルの要素 (「<p>」や「<table>」など) をインライン要素 (「<a>」、「<span>」など) 内に配置しようとしたことです。 "、または "<font>")。

壊れた HTML を修正する標準的な方法はなく、それぞれのパーサーが最善を尽くします。無効な HTML に対して再現可能な結果が必要な場合は、厳密に同じバージョンの同じパーサーに固執する必要があります。

于 2013-04-10T16:14:37.293 に答える