BS4: обернуть диапазон братьев и сестер с новыми тегами - PullRequest
0 голосов
/ 08 ноября 2019

Я на BeautifulSoup 4.8.1.

Я хочу дополнить HTML-файл, чтобы выделить интересующий его раздел.

Давайте приведем пример. Предположим, я получил

<div> some preceding junk </div>
<div> BEGIN TRIGGER </div>
<div> Lorem ipsum dolor </div>
<div> sit amet, consetetur elitir </div>
<div> more clutter at the end </div>
<div> END TRIGGER </div>

Я уже способен извлечь список, содержащий четыре тега <div> в середине (т.е. от 'BEGIN TRIGGER' до 'суматохи', в том числе).

Я хочу получить следующий вывод:

<div> some preceding junk </div>
<p>
 <div> BEGIN TRIGGER </div>
 <div> Lorem ipsum dolor </div>
 <div> sit amet, consetetur elitir </div>
 <div> more clutter at the end </div>
</p>
<div> END TRIGGER </div>

Как мне этого добиться? Я думаю, что знание того, как создать нового родного брата для известного bs4.element.Tag, может оказаться полезным, если невозможно обернуть весь диапазон «атомарно».

1 Ответ

0 голосов
/ 08 ноября 2019

На вашем примере я пробовал это. Надеюсь, это поможет. Используя Regex, сначала нужно добавить элемент, который нужно добавить тег, а затем find_next_siblings (), чтобы найти до этого.

Наконец, добавить новый тег

, а затем добавить в него все теги div.

import re
from bs4 import BeautifulSoup

html='''<div> some preceding junk </div>
<div> BEGIN TRIGGER </div>
<div> Lorem ipsum dolor </div>
<div> sit amet, consetetur elitir </div>
<div> more clutter at the end </div>
<div> END TRIGGER </div>'''

soup=BeautifulSoup(html,'html.parser')
search=soup.find("div",text=re.compile('BEGIN'))
prev=search.find_previous_siblings('div')[0]

new_tag = soup.new_tag("p")
new_tag.append(str(search) +'\n')
for item in search.find_next_siblings('div'):

    if 'END TRIGGER' in item.text:
       lastement=item
       break;
    else:
        new_tag.append(str(item) + '\n')

finalsoup=str(prev) +'\n' + new_tag.prettify(formatter=None) + '\n' + str(lastement)

print(finalsoup)

Выход :

<div> some preceding junk </div>
<p>
 <div> BEGIN TRIGGER </div>
 <div> Lorem ipsum dolor </div>
 <div> sit amet, consetetur elitir </div>
 <div> more clutter at the end </div>
</p>
<div> END TRIGGER </div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...