Home > Back-end >  How to extract text without tags (between br)?
How to extract text without tags (between br)?

Time:10-21

I am trying to store headings and paragraphs into different arrays, i can't manage with text between <br>.

Here's my HTML code and python below:

<p><strong>W Ognisku</strong><br>W londyńskim Ognisku Polskim odbyło się spotkanie z brytyjskim historykiem<br><br><strong>10 lat polskiej szkoły sobotniej Copernicus </strong><br>W Wielkiej Brytanii <br><br><strong>IV Bieg Pamięci Dywizjonu 303 w Londynie</strong><br>Już po raz czwarty w dzielnicy<br><br><strong>81 Liebermana</strong><br>21 majowym przeciwstawił się rządom Piłsudskiego. <br><strong><br>Londynem</strong><br>Był setki pełnymi garściami.</p>

and soup:

from bs4 import BeautifulSoup

with open('/Users/milek/Desktop/index.html', 'r') as f:
    contents = f.read()
    soup = BeautifulSoup(contents, 'lxml')
    headings = []
    txt = []

    for strong_tag in soup.find_all('strong'):
        headings.append(strong_tag.text)

print(headings)

I retrieved headings with full success but I have pretty hard time storing the rest - paragraphs.

CodePudding user response:

from bs4 import BeautifulSoup
html = """<html>
 <body>
  <p>
   <strong>
    W Ognisku
   </strong>
   <br/>
   W londyńskim Ognisku Polskim odbyło się spotkanie z brytyjskim historykiem
   <br/>
   <br/>
   <strong>
    10 lat polskiej szkoły sobotniej Copernicus
   </strong>
   <br/>
   W Wielkiej Brytanii
   <br/>
   <br/>
   <strong>
    IV Bieg Pamięci Dywizjonu 303 w Londynie
   </strong>
   <br/>
   Już po raz czwarty w dzielnicy
   <br/>
   <br/>
   <strong>
    81 Liebermana
   </strong>
   <br/>
   21 majowym przeciwstawił się rządom Piłsudskiego.
   <br/>
   <strong>
    <br/>
    Londynem
   </strong>
   <br/>
   Był setki pełnymi garściami.
  </p>
 </body>
</html>"""


soup = BeautifulSoup(html, 'lxml')
goal = [x.next_element.strip() for x in soup.select('p strong   br')]
print(goal)

Output:

['W londyńskim Ognisku Polskim odbyło się spotkanie z brytyjskim historykiem', 'W Wielkiej 
Brytanii', 'Już po raz czwarty w dzielnicy', '21 majowym przeciwstawił się rządom Piłsudskiego.', 'Był setki pełnymi garściami.']

CodePudding user response:

Just in addition to @αԋɱҽԃ αмєяιcαη precise answer for list - Instead of working with lists, that often causes mismatches of length, if elements are not available as expected, I would always recommend to use more structured constructs like dictionaries and extract all related data in one go:

{
    e.get_text(strip=True):e.find_next_sibling(text=True)
    for e in soup.select('p strong')
}

Example

from bs4 import BeautifulSoup

html = '''
<p><strong>W Ognisku</strong><br>W londyńskim Ognisku Polskim odbyło się spotkanie z brytyjskim historykiem<br><br><strong>10 lat polskiej szkoły sobotniej Copernicus </strong><br>W Wielkiej Brytanii <br><br><strong>IV Bieg Pamięci Dywizjonu 303 w Londynie</strong><br>Już po raz czwarty w dzielnicy<br><br><strong>81 Liebermana</strong><br>21 majowym przeciwstawił się rządom Piłsudskiego. <br><strong><br>Londynem</strong><br>Był setki pełnymi garściami.</p>
'''
soup = BeautifulSoup(html)

{
    e.get_text(strip=True):e.find_next_sibling(text=True)
    for e in soup.select('p strong')
}

Output

{'W Ognisku': 'W londyńskim Ognisku Polskim odbyło się spotkanie z brytyjskim historykiem',
 '10 lat polskiej szkoły sobotniej Copernicus': 'W Wielkiej Brytanii ',
 'IV Bieg Pamięci Dywizjonu 303 w Londynie': 'Już po raz czwarty w dzielnicy',
 '81 Liebermana': '21 majowym przeciwstawił się rządom Piłsudskiego. ',
 'Londynem': 'Był setki pełnymi garściami.'}​
  • Related