Как использовать BeautifulSoup для анализа тегов <p>, как если бы они были закрыты? - PullRequest
0 голосов
/ 22 января 2019

Очевидно, что теги <p> необходимо закрывать только в том случае, если в абзаце будет разрешен следующий тег, но его не следует включать.

# case 1
<div>
<p>Sentence 1.
<span>Interjection!<span>
<p>Sentence 2.
</div>

Это закончилось бы двумя параграфами (я думаю), это было бы так, как если бы вы написали:

# case 2
<div>
<p>Sentence 1. <span>Interjection!<span></p>
<p>Sentence 2.</p>
</div>

В моем случае я бы хотел, чтобы BeautifulSoup проанализировал абзац так, как того требует стандарт. Но, в частности, в приведенном ниже примере (случай 3) я хотел бы только «Предложение 1.», оставив заголовок вне него.

# case 3
<div>
<p>Sentence 1. 
<h2>Interjection!<h2>
<p>Sentence 2.
</div>

В настоящее время BeautifulSoup продолжает анализировать (как в случае 4), но это не то, что я вижу при просмотре такого сайта в Интернете (с использованием chrome).

# case 4 (bs4 currently)
<div>
<p>Sentence 1. <h2>Interjection!<h2> <p>Sentence 2.
</div>
</p>
</p> 

Я использую html.parser. Может ли здесь помочь другой парсер?

1 Ответ

0 голосов
/ 22 января 2019

Предположим, у вас есть опечатка для <span> и <h2>, потому что у нее нет закрывающего тега или отсутствует /, в противном случае он создаст другой пустой тег.

И да, использование другого синтаксического анализатора, такого как lxml, может помочь исправить структуру, и результат будет таким же, как в стандартном HTML (Chrome).

ввод варианта 1:

<div>
<p>Sentence 1.
<span>Interjection!</span>
<p>Sentence 2.
</div>

результаты 1 случая, игнорируя <html><body>:

<div>
<p>Sentence 1. <span>Interjection!</span></p>
<p>Sentence 2.</p>
</div>

вход 2 случая

<div>
<p>Sentence 1. 
<h2>Interjection!</h2>
<p>Sentence 2.
</div>

результат 2 случая

<div>
<p>Sentence 1.</p>
<h2>Interjection!</h2>
<p>Sentence 2.</p>
</div>

Отличается h2не включается в p, потому что это block element или начинается с новой строки, поэтому синтаксический анализатор остановит и закроет тег, в то время как span равен inline element.

...