Как получить весь текст в одной строке из одних и тех же html-тегов внутри определенного HTML-тега?

#html #beautifulsoup

Вопрос:

У меня есть довольно длинный HTML-файл, который выглядит так:

 <div><nobr>
<span>ABC</span>
<span>DEF</span>
<span>GHI</span>
</nobr></div>

<div><nobr>
<span>100</span>
</nobr></div>

<div><nobr>
<span>JKL</span>
<span>MNO</span>
<span>PQR</span>
</nobr></div>

<div><nobr>
<span>101</span>
</div></nobr>'
 

Это то, что я пробовал:

 soup = BeautifulSoup(html_code, 'lxml')
nobr_tags = soup.select('nobr')
 

Как я могу получить весь текст внутри span тегов в nobr HTML-теге в одной строке с помощью BeautifulSoup?

Я хочу получить это:

 ABCDEFGHI, 100, JKLMNOPQR, 101, ... 
 

Но то, что я получил, было:

 ABC, DEF, GHI, 100, JKL, MNO, PQR, 101, ...
 

Некоторые <nobr> теги содержат 2, 3 или 4 <span> тега внутри <nobr> тега.
Независимо от того, сколько тегов span содержится в теге nobr, я хочу собрать весь текст внутри <nobr> тега в одну строку.

Ответ №1:

Вы можете использовать генератор-выражение для join() тегов с a , .

 from bs4 import BeautifulSoup

html_doc = """
<div>
   <nobr>
      <span>ABC</span>
      <span>DEF</span>
      <span>GHI</span>
   </nobr>
</div>
<div>
   <nobr>
      <span>100</span>
   </nobr>
</div>
<div>
   <nobr>
      <span>JKL</span>
      <span>MNO</span>
      <span>PQR</span>
   </nobr>
</div>
<div>
   <nobr>
      <span>101</span>
</div>
</nobr>
"""

soup = BeautifulSoup(html_doc, "lxml")

print(
    ", ".join(x.get_text(strip=True) for x in soup.select("nobr"))
)
 

Выход:

 ABCDEFGHI, 100, JKLMNOPQR, 101
 

Комментарии:

1. Большое вам спасибо за вашу помощь! Это работает как по волшебству! : )