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.'}