Jsoup парсинг и вложенные теги - PullRequest
3 голосов
/ 24 марта 2012

Я изучаю Jsoup и у меня есть этот HTML:

 [...]
 <p style="..."> <!-- div 1 -->
   Content
 </p>
 <p style="..."> <!-- div 2 -->
   Content
 </p>
 <p style="..."> <!-- div 3 -->
   Content
 </p>
 [...]

Я использую Jsoup.parse () и выбор документа ("p") для перехвата "содержимого" (и работает хорошо).Но ...

 [...]
 <p style="..."> <!-- div 1 -->
   Content
 </p>
 <p style="..."> <!-- div 2 -->
   Content
 </p>
 <p style="..."> <!-- div 3 -->
   Content
   <p style="..."></p>
   <p style="..."></p>
 </p>
 [...]

В этой сцене я вижу, что Jsoup.parse () преобразует этот код в:

 [...]
 <p style="..."> <!-- div 1 -->
   Content
 </p>
 <p style="..."> <!-- div 2 -->
   Content
 </p>
 <p style="..."> <!-- div 3 -->
   Content
 </p>
 <p style="..."> <!-- div 4 -->
 </p>
 <p style="..."> <!-- div 5 -->
 </p>
 [...]

Как сохранить порядок вложенных абзацев с помощью Jsoup (div 4 & 5 внутри div 3)?


Добавить пример:

HTML-файл :

 <html>
 <head>
    <title>Title</title>
 </head>
 <body>
    <p style="margin-left:2em">
            <span class="one">Text</span>
            <span class="two"><span class="nest">Text</span></span>
            <span class="three"></span>
    </p>
    <p style="margin-left:2em">
            <span class="one">Text</span>
            <span class="two"><span class="nest">Text</span></span>
            <span class="three"></span>
    </p>
    <p style="margin-left:2em">
            <span class="one">Text</span>
            <span class="two"><span class="nest">Text</span></span>
            <span class="three"></span>
            <p style="margin-left:2em"></p>
            <p style="margin-left:2em"></p>
    </p>

 </body>
 </html>

Код Java :

Document doc = null;
doc = Jsoup.connect(URL_with_HTML).get();
System.out.println(doc.outerHtml());

Возврат :

<html>
<head> 
 <title>Title</title> 
</head> 
<body> 
 <p style="margin-left:2em"> <span class="one">Text</span> <span class="two"><span class="nest">Text</span></span> <span class="three"></span> </p> 
 <p style="margin-left:2em"> <span class="one">Text</span> <span class="two"><span class="nest">Text</span></span> <span class="three"></span> </p> 
 <p style="margin-left:2em"> <span class="one">Text</span> <span class="two"><span class="nest">Text</span></span> <span class="three"></span> </p>
 <p style="margin-left:2em"></p> 
 <p style="margin-left:2em"></p> 
 <p></p>   
</body>
</html>

Правильно ли это?Я использую Jsoup 1.6.1.Я понимаю, что Jsoup должен возвращать вложенные абзацы вместо предыдущего.

Ответы [ 2 ]

3 голосов
/ 24 марта 2012

Вложенные абзацы не существуют в HTML.Предыдущий абзац закрывается автоматически, поскольку Jsoup реализует спецификацию WHATWG HTML5 :

  1. Тег * p автоматически закрывается любым из следующих действий: address, article, aside, blockquote, div, dl, fieldset, footer, form, h1, h2, h3, h4, h5, h6, header, hgroup, hr, main, menu, nav, ol, p, pre, section, table или ul.Следовательно, <p><div></div> becomes <p></p><div></div>.
  2. Конечный тег с именем p (т. Е. </p>), у которого нет соответствующего начального тега, является ошибкой синтаксического анализа и заменяется на <p>.Поэтому <span></span></p> становится <span></span><p>.

Таким образом, jsoup верен и ваш HTML-код недействителен.

Убедитесь, что ваш HTML-код недействителен, поскольку у вас слишком много </p> а не потому, что "вложенные" абзацы.Вложение не может произойти, потому что они автоматически закрываются.Но более поздний </p> устарел, потому что «соответствующий» <p> ранее уже автоматически закрывался.

0 голосов
/ 24 марта 2012

Hj, я понимаю оригинальный вопрос.Но я думаю, что это ошибка Jsoup (не ваша).Так как это простой пример:

<html>
    <head></head>
    <body>
        <p></p>
        <p>
            <div></div>
        </p>
    </body>
</html>

Но Jsoup анализирует это:

<html>
    <head></head>
    <body>
        <p></p>
        <p></p>
        <div></div>
        <p></p>
    </body>
</html>

Если вы можете, пожалуйста, зарегистрируйте эту ошибку, чтобы автор мог ее исправить: -)

PS: Просто слово "привет", stackoverflow не позволяет этого?

...