You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Beautiful Soup爬取HAR网站时返回异常字符串的问题

问题描述

爬取HAR网站指定房源的Subdivision Information区域时,尝试提取"Average List Price:$428,844"这类文本,得到的却是换行加分隔线的无效内容,而非预期数据。

相关代码

请求代码

house_url = 'https://www.har.com/homedetail/2701-main-st-1910-houston-tx-77002/15331551'
house_response = requests.get(url=house_url, headers=your_header)
house_soup = BeautifulSoup(house_response.text, 'html.parser').find('div', {'class':'pt-2 pb-2 mr-4 pr-md-5 ml-4 pl-md-5'})

文本提取代码

house_soup.find('div',{'id':'subDivisonInfo'}).find('div',{'class':'row'}).findAll('div',{'class':'col-md-4 col-6 mb-4'})[0].getText()
原因及解决办法

核心原因

  • 动态渲染导致源码无数据:该区域的细分信息是通过JavaScript动态加载的,requests.get直接获取的HTML源码里只有占位的分隔线,实际数据还未渲染到页面中。
  • 选择器未精准定位:即便数据已加载,当前选择器可能选中了包含分隔线的外层容器,而非存储实际文本的子元素。

解决方案

1. 用Selenium模拟浏览器加载

模拟浏览器完整渲染页面,等待JavaScript执行完毕后再提取数据:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get(house_url)
# 等待目标元素加载完成
wait = WebDriverWait(driver, 10)
target_item = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#subDivisonInfo .col-md-4.col-6.mb-4')))
print(target_item.text)
driver.quit()

2. 抓包直接请求API接口

打开浏览器开发者工具(F12),切换到Network→XHR标签,刷新页面后找到返回细分信息的API接口,复制接口URL和请求参数,直接用requests请求获取JSON格式的原始数据,这种方式效率更高。

3. 修正选择器(若数据已存在于源码)

检查页面实际HTML结构,定位到存储目标文本的子元素(比如<span>或<p>标签),调整选择器:

# 示例,需根据实际HTML结构调整
target_container = house_soup.find('div',{'id':'subDivisonInfo'}).find('div',{'class':'row'}).findAll('div',{'class':'col-md-4 col-6 mb-4'})[0]
actual_text = target_container.find('span').get_text(strip=True)
print(actual_text)

内容的提问来源于stack exchange,提问作者Josh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:12:14