如何提取Zillow数据中相同li标签下的卧室、卫浴、面积三类字段?
解决方案
原有代码存在两个问题:
- 全局查找class为空的li元素,容易匹配到页面其他无关节点,且返回的3个匹配结果分别对应卧室、卫浴、面积三个字段,原有代码仅取了第一个结果
- 直接调用li的text属性会连带单位文本一起返回,无法单独提取数值,也没有处理面积的千位分隔符逗号
修正后可正常提取目标值的代码如下:
from bs4 import BeautifulSoup tag='<div class="list-card-info"><a class="list-card-link list-card-link-top-margin" href="https://www.zillow.com/homedetails/12021-Tralee-Rd-UNIT-102-Lutherville-MD-21093/60873148_zpid/" tabindex="0"><address class="list-card-addr">12021 Tralee Rd UNIT 102, Lutherville, MD 21093</address></a><div class="list-card-footer"><p class="list-card-extra-info">LONG & FOSTER REAL ESTATE, INC.</p></div><div class="list-card-heading"><div class="list-card-price">$411,000</div><ul class="list-card-details"><li class="">3<abbr class="list-card-label"> <!-- -->bds</abbr></li><li class="">2<abbr class="list-card-label"> <!-- -->ba</abbr></li><li class="">1,813<abbr class="list-card-label"> <!-- -->sqft</abbr></li><li class="list-card-statusText">- Apartment for sale</li></ul></div></div>' soup = BeautifulSoup(tag, 'html.parser') # 提取地址、价格字段 address = soup.find('address', {'class': 'list-card-addr'}).text price = soup.find('div', {'class': 'list-card-price'}).text # 限定在房源属性列表内查找空class的li,避免匹配无关节点 attr_list = soup.select('ul.list-card-details li[class=""]') # 分别提取三个字段的数值,处理面积的千位分隔符 beds = attr_list[0].contents[0].strip() baths = attr_list[1].contents[0].strip() sqft = attr_list[2].contents[0].strip().replace(',', '') # 输出结果 print(address, '---', price, '---', beds, '---', baths, '---', sqft)
运行后输出结果:
12021 Tralee Rd UNIT 102, Lutherville, MD 21093 --- $411,000 --- 3 --- 2 --- 1813
内容的提问来源于stack exchange,提问作者user16091296
相关产品推荐
相关产品推荐

