BeautifulSoup - объединить последовательные теги - PullRequest
0 голосов
/ 25 апреля 2018

Я должен работать с самым грязным HTML, где отдельные слова разбиты на отдельные теги, как в следующем примере:

<b style="mso-bidi-font-weight:normal"><span style='font-size:14.0pt;mso-bidi-font-size:11.0pt;line-height:107%;font-family:"Times New Roman",serif;mso-fareast-font-family:"Times New Roman"'>I</span></b><b style="mso-bidi-font-weight:normal"><span style='font-family:"Times New Roman",serif;mso-fareast-font-family:"Times New Roman"'>NTRODUCTION</span></b>

Это довольно сложно для чтения, но в основном слово "ВВЕДЕНИЕ"разделить на

<b><span>I</span></b> 

и

<b><span>NTRODUCTION</span></b>

, имеющие одинаковые встроенные свойства для тегов span и b.

Какой хороший способ объединить их?Я подумал, что перебираю, чтобы найти последовательные теги b, подобные этому, но застрял на том, как мне слить последовательные теги b.

for b in soup.findAll('b'):
    try:
       if b.next_sibling.name=='b':
       ## combine them here??
    except:
        pass

Есть идеи?

РЕДАКТИРОВАТЬ: Ожидаемый результат следующий

<b style="mso-bidi-font-weight:normal"><span style='font-family:"Times New Roman",serif;mso-fareast-font-family:"Times New Roman"'>INTRODUCTION</span></b>

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Приведенное ниже решение объединяет текст из всех выбранных тегов <b> в один <b> по вашему выбору и разбивает остальные.

Если вы хотите объединить текст только из последовательных тегов, выполните подход Дэнни.

Код:

from bs4 import BeautifulSoup

html = '''
<div id="wrapper">
  <b style="mso-bidi-font-weight:normal">
    <span style='font-size:14.0pt;mso-bidi-font-size:11.0pt;line-height:107%;font-family:"Times New Roman",serif;mso-fareast-font-family:"Times New Roman"'>I</span>
  </b>
  <b style="mso-bidi-font-weight:normal">
    <span style='font-family:"Times New Roman",serif;mso-fareast-font-family:"Times New Roman"'>NTRODUCTION</span>
  </b>
</div>
'''

soup = BeautifulSoup(html, 'lxml')
container = soup.select_one('#wrapper')  # it contains b tags to combine
b_tags = container.find_all('b')

# combine all the text from b tags
text = ''.join(b.get_text(strip=True) for b in b_tags)

# here you choose a tag you want to preserve and update its text
b_main = b_tags[0]  # you can target it however you want, I just take the first one from the list
b_main.span.string = text  # replace the text

for tag in b_tags:
    if tag is not b_main:
        tag.decompose()

print(soup)

Любые комментарии приветствуются.

0 голосов
/ 25 апреля 2018

Возможно, вы могли бы проверить, является ли b.previousSibling тегом b, а затем добавить в него внутренний текст текущего узла.После этого вы сможете удалить текущий узел из дерева с помощью b.decompose.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...