Использование Beautifulsoup для разделения строк, разделенных `<br>` - PullRequest
0 голосов
/ 06 сентября 2018

Я хочу получить данные с веб-сайта, который использует <br>. В html, проанализированном с помощью Beautifulsoup4, иногда у меня следующий шаблон:

"<p class=some_class>text_1. text_2 (text_3<span class=GramE>)</span> 
<br> 
text_4,<span style='mso-fareast-font-family:"Arial Unicode MS"'> 
</span>text_5.</p>"

Но если бы сайт был написан лучше, он бы выглядел так:

"<p class=some_class>text_1. text_2(text_3<span class=GramE>)</span 
</p> <p class=some_class>
text_4,<span style='mso-fareast-font-family:"Arial Unicode MS"'> 
</span>text_5.</p>

Чтобы извлечь нужные мне строки, я бы извлек весь текст внутри каждого <p>. Однако теперь строки, которые я хочу разделить, разделены <br>.

У меня следующий вопрос: как я могу использовать <br>, чтобы отделить интересующие меня части строки? Я имею в виду, я хочу что-то вроде [text_1.+text_2+text_3, text_4+text_5.].

Я явно спрашиваю об использовании <br>, так как это единственный найденный элемент, который разделяет интересующие меня строки. Более того, в некоторых других частях сайта у меня есть <br/>, разделяющий интересующие меня строки вместо <br>.

Я не могу решить эту проблему с помощью функции replace (), поскольку мой объект - это тег froom bs4. Кроме того, использование find ("br") из bs4 дает мне "<br/>", а не текст, который я хочу. Таким образом, ответы на этот вопрос не совсем то, что я хочу. Я думаю, что одним из способов было бы преобразовать тег из bs4, который мне нужен, в html, затем изменить «<br/>» с помощью функции replace () и, наконец, преобразовать его обратно в элемент bs4. Однако я не знаю, как сделать это изменение, и я также хочу знать, есть ли более простой и короткий способ сделать это.

1 Ответ

0 голосов
/ 07 сентября 2018

Это решение, которое я нашел, но оно длинное и неэффективное, так как не использует никаких функций bs4. Хотя, это работает.

html_doc = """
"<p class=some_class>text_1. text_2 (text_3<span class=GramE>)</span> 
<br> 
text_4,<span style='mso-fareast-font-family:"Arial Unicode MS"'> 
</span>text_5.</p>"
"""

def replace_br(soup_object):
    html1=str(soup_object)
    html1=html1.replace("<br>", "</p> <p>")
    soup_html1 = BeautifulSoup(html1, 'html.parser')
    return soup_html1.find_all("p")

replace_br(html_doc)
[<p class="some_class">text_1. text_2 (text_3<span class="GramE">)</span>
</p>, <p> 
text_4,<span style='mso-fareast-font-family:"Arial Unicode MS"'>
</span>text_5.</p>]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...