如何用BeautifulSoup将抓取的单字符串企业信息转为字典?
网页企业信息提取:将连续字符串转为结构化字典
问题背景
使用BeautifulSoup抓取网页企业信息时,通过field = soup.select('span:-soup-contains("Nombre y dirección del contratista") + div')获取到目标div元素,但调用field[0].text得到的是无分隔的连续字符串,无法拆分各字段。
相关HTML结构
<div> <span class="timark">Nombre y dirección del contratista</span> <div class="txtmark"> "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 class="ojshref" href="https://www.vivavis.com/" target="_blank">https://www.vivavis.com/</a> </div> </div>
当前输出情况
field的输出:
[<div class="txtmark" 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 class="nutsCode">DE Deutschland</span><br/>Código postal: D-76275<br/>País: Alemania<br/>Dirección de internet: <a class="ojshref" href="https://www.vivavis.com/" target="_blank">https://www.vivavis.com/</a></div>]
field[0].text的输出:
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/
目标格式
需要转换为如下结构化字典:
{ '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/' }
解决方案
方法一:直接遍历目标div的子节点处理
这种方法直接操作HTML节点,能精准处理包含子元素(如<span>、<a>)的字段:
from bs4 import BeautifulSoup # 假设已获取到soup对象和field变量 target_div = field[0] company_info = {} for item in target_div.contents: # 跳过空文本节点和<br>标签 if item.name == 'br' or str(item).strip() == '': continue # 处理纯文本节点(带引号的字段) if item.name is None: clean_text = item.strip().strip('"') if ': ' in clean_text: key, value = clean_text.split(': ', 1) company_info[key] = value else: # 处理包含子元素的字段(如Código NUTS、Dirección de internet) # 获取字段名部分的文本 label_text = item.previous_sibling.strip().strip('"') if ': ' in label_text: key, _ = label_text.split(': ', 1) # 获取子元素的文本内容 value = item.get_text(strip=True) company_info[key] = value print(company_info)
方法二:替换<br>为换行符后拆分文本
这种方法通过将<br>替换为换行符,把连续文本拆分为多行,再逐行处理,代码更简洁:
# 假设已获取到target_div # 将所有<br>标签替换为换行符 for br in target_div.find_all('br'): br.replace_with('\n') # 获取带换行分隔的文本,同时清理多余空格和引号 text_content = target_div.get_text(strip=True, separator='\n') lines = [line.strip('"') for line in text_content.split('\n') if line.strip()] company_info = {} for line in lines: if ': ' in line: key, value = line.split(': ', 1) company_info[key] = value print(company_info)
内容的提问来源于stack exchange,提问作者David Jimenez
相关产品推荐
相关产品推荐

