使用BeautifulSoup与Python解析双列布局的<li>元素并提取属性值到变量
解决BeautifulSoup解析房产特征列表的循环提取问题
嘿,我来帮你搞定这个循环解析的问题!你已经能定位到单个<li>元素了,现在只需要把范围扩大到所有特征项,然后通过循环提取每个属性名和对应值就行。比起单独定义var1、var2这类变量,用字典存储会更灵活(毕竟如果后续属性数量变化,不用挨个改变量名),当然你也可以从字典里再赋值给单独变量,具体方案如下:
实现步骤
- 先定位到包含所有特征的容器(也就是
id="b_detalii_caracteristici"的<div>); - 提取该容器下所有的
<li>元素(不管它属于哪个<ul>); - 遍历每个
<li>,拆分出左侧的属性名称,再提取右侧<span>里的属性值; - 将键值对存入字典,方便后续调用。
完整代码示例
from bs4 import BeautifulSoup # 假设你的HTML内容已经存放在html_content变量中 html_content = '''<div id="b_detalii_caracteristici" class="margin-boxes"> <h2 class="titlu-box special-caracteristici">Caracteristici</h2> <div class="row"> <div class="col-lg-6 col-md-6 col-sm-6"> <ul class="lista-tabelara"> <li>Nr. camere:<span>2</span></li> <li>Suprafaţă utilă:<span>44 mp</span></li> <li>Suprafaţă construită:<span>44 mp</span></li> <li>Compartimentare:<span>decomandat</span></li> <li>Confort:<span>lux</span></li> <li>Etaj:<span>Etaj 1 / 8</span></li> <li>Nr. bucătării:<span>1</span></li> <li>Nr. băi:<span>1</span></li> </ul> </div> <div class="col-lg-6 col-md-6 col-sm-6"> <ul class="lista-tabelara mobile-list"> <li>An construcţie:<span>2019</span></li> <li>Structură rezistenţă:<span>beton</span></li> <li>Tip imobil:<span>bloc de apartamente</span></li> <li>Regim înălţime:<span>P+8E</span></li> <li>Nr. balcoane:<span>1</span></li> </ul> </div> </div></div>''' soup = BeautifulSoup(html_content, 'html.parser') # 定位特征容器 features_container = soup.find('div', id='b_detalii_caracteristici') # 获取所有特征项的<li>元素 all_feature_items = features_container.find_all('li') # 创建字典存储所有特征 property_features = {} for item in all_feature_items: # 提取属性名称:拆分文本去掉冒号和多余空格 property_name = item.text.split(':')[0].strip() # 提取<span>内的属性值 property_value = item.find('span').text.strip() # 存入字典 property_features[property_name] = property_value # 如果你需要单独的变量,可以从字典中赋值 nr_camere = property_features['Nr. camere'] suprafata_utila = property_features['Suprafaţă utilă'] an_constructie = property_features['An construcţie'] # 打印验证结果 print("所有提取的特征:") for name, value in property_features.items(): print(f"{name}: {value}")
代码说明
- 用
find_all('li')直接从特征容器中获取所有<li>,不用分别处理两个<ul>,简化了代码; - 字典
property_features可以灵活存储所有特征,后续要调用哪个属性直接通过键名获取即可; - 如果必须用单独的变量,从字典里赋值的方式也比逐个解析
<li>更简洁。
内容的提问来源于stack exchange,提问作者Ovidiu Diaconu
相关产品推荐
相关产品推荐

