I'm trying to scrape some information from a webpage, I'm getting the information with BeautifulSoup and the problem I have is that I'm getting all the information in a single String instead of getting it in different ones, the part of the HTML I'm getting now is some information from a company, the HTML follows this:
<div>
<span >Nombre y dirección del contratista</span>
<div >
"Nombre oficial: VIVAVIS AG"
<br>
"Número de identificación fiscal: HRB 737454"
<br>
"Dirección postal: Nobelstrasse 18, D-76275, Ettlingen, Germany"
<br>
"Localidad: Ettlingen"
<br>
"Código NUTS: "
<span class ="nutsCode">DE Deutschland</span>
<br>
"Código postal: D-76275"
<br>
"País: Alemania"
<br>
"Dirección de internet: "
<a href="https://www.vivavis.com/" target="_blank">https://www.vivavis.com/</a>
</div>
</div>
I'm scraping this with the following line:
field = soup.select('span:-soup-contains("Nombre y dirección del contratista") div')
This gets me all the HTML, the result of printing field
is this:
[<div style="color:black">Nombre oficial: VIVAVIS AG<br/>Número de identificación fiscal: HRB 737454<br/>Dirección postal: Nobelstrasse 18, D-76275, Ettlingen, Germany<br/>Localidad: Ettlingen<br/>Código NUTS: <span >DE
Deutschland</span><br/>Código postal: D-76275<br/>País: Alemania<br/>Dirección de internet: <a href="https://www.vivavis.com/" target="_blank">https://www.vivavis.com/</a></div>]
I tried getting only the text from this with field[0].text
but the result is this:
Nombre oficial: VIVAVIS AGNúmero de identificación fiscal: HRB 737454Dirección postal: Nobelstrasse 18, D-76275, Ettlingen, GermanyLocalidad: EttlingenCódigo NUTS: DE DeutschlandCódigo postal: D-76275País: AlemaniaDirección de internet: https://www.vivavis.com/
How can I turn this String into a list/map/dictionary similar to this?
[
'Nombre oficial': 'VIVAIS AG',
'Número de identificación fiscal': 'HRB 737454',
'Dirección postal': 'Nobelstrasse 18, D-76275, Ettlingen, Germany',
'Localidad': 'Ettlingen',
'Código NUTS': 'DE Deutschland',
'Código postal': 'D-76275',
'País': 'Alemania',
'Dirección de internet': 'https://www.vivavis.com/'
]
CodePudding user response:
This returns something you are looking for. There might be a better way though, I'm just playing around. I'm sure you can fix the last things if needed.
text = '''<div >
"Nombre oficial: VIVAVIS AG"
<br>
"Número de identificación fiscal: HRB 737454"
<br>
"Dirección postal: Nobelstrasse 18, D-76275, Ettlingen, Germany"
<br>
"Localidad: Ettlingen"
<br>
"Código NUTS: "
<span class ="nutsCode">DE Deutschland</span>
<br>
"Código postal: D-76275"
<br>
"País: Alemania"
<br>
"Dirección de internet: "
<a href="https://www.vivavis.com/" target="_blank">https://www.vivavis.com/</a>
</div>
'''
text = text.replace('<div >', '').replace(' </div>', '').replace('"', '')
txt = text.split('<br>')
output = {}
for i in txt:
f = i.split(': ')
output[f[0].strip()] = re.sub('<[^>] >', '', f[1]).strip()
print (output)
output
{'Código NUTS': 'DE Deutschland',
'Código postal': 'D-76275',
'Dirección de internet': 'https://www.vivavis.com/',
'Dirección postal': 'Nobelstrasse 18, D-76275, Ettlingen, Germany',
'Localidad': 'Ettlingen',
'Nombre oficial': 'VIVAVIS AG',
'Número de identificación fiscal': 'HRB 737454',
'País': 'Alemania'}
CodePudding user response:
Using the .strings generator, we get the desired answer.
from bs4 import BeautifulSoup
html = """<div>
<span >Nombre y dirección del contratista</span>
<div >
"Nombre oficial: VIVAVIS AG"
<br>
"Número de identificación fiscal: HRB 737454"
<br>
"Dirección postal: Nobelstrasse 18, D-76275, Ettlingen, Germany"
<br>
"Localidad: Ettlingen"
<br>
"Código NUTS: "
<span class ="nutsCode">DE Deutschland</span>
<br>
"Código postal: D-76275"
<br>
"País: Alemania"
<br>
"Dirección de internet: "
<a href="https://www.vivavis.com/" target="_blank">https://www.vivavis.com/</a>
</div>
</div>"""
soup = BeautifulSoup(html, 'html.parser')
tmp = ""
output = []
# We iterate over the lines, removing extra quotes and spaces.
for string in soup.stripped_strings:
string = string.replace(r'"', "")
if string == "Nombre y dirección del contratista":
continue
# If the line is not complete, we save it in order to supplement it at the next iteration.
elif string.endswith(': '):
tmp = string
continue
else:
string_tmp = tmp string
list_tmp = string_tmp.split(': ')
output.append(list_tmp)
tmp = ""
print(dict(output))
-----------------------------------------
{'Nombre oficial': 'VIVAVIS AG',
'Número de identificación fiscal': 'HRB 737454',
'Dirección postal': 'Nobelstrasse 18, D-76275, Ettlingen, Germany',
'Localidad': 'Ettlingen',
'Código NUTS': 'DE Deutschland',
'Código postal': 'D-76275',
'País': 'Alemania',
'Dirección de internet': 'https://www.vivavis.com/'}