Home > Back-end >  Python split String by fields
Python split String by fields

Time:12-22

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/'}
  • Related