如何从Zillow链接中提取估计的房屋价值?

时间:2018-04-09 01:09:00

标签: python html beautifulsoup

我希望我的代码能够将{em> Zestimate 值关闭this page,以便我可以使用它(在本例中为10,037,774)。我该怎么做呢?

3 个答案:

答案 0 :(得分:5)

首先,网站在识别Python脚本时返回不完整的数据。为了解决这个问题,你必须使用假的User-Agent来执行虚假请求。

import requests

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'}
r = requests.get('https://www.zillow.com/homes/for_sale/19882656_zpid/34.217551,-118.600674,34.122534,-118.723412_rect/12_zm/1_fr/', headers=headers)

这将提供页面源中可用的所有元素。但是,现在,许多元素都是使用JavaScript动态生成的。因此,它们在页面源中不可用。您想要的值在<span class id="yui_3_18_1_2_1523251661826_947">内,在检查元素时可以在开发人员工具中看到。

但是,在页面源中,此标记看起来像

<span class=""> $10,037,734 <span class="value-suffix">   </span></span>

因此,您无法使用id来获取值。您可以使用<span>获取包含 Zestimate 文本的soup.find('span', {'data-target-id': 'zest-tip-hdp'})标记。要获取下一个<span>代码,您可以使用find_next('span')

完整代码:

import requests
from bs4 import BeautifulSoup

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'}
r = requests.get('https://www.zillow.com/homes/for_sale/19882656_zpid/34.217551,-118.600674,34.122534,-118.723412_rect/12_zm/1_fr/', headers=headers)
soup = BeautifulSoup(r.text, 'lxml')

zestimate = soup.find('span', {'data-target-id': 'zest-tip-hdp'}).find_next('span').text
print(zestimate)
#  $10,037,734  

您可以通过另一种方式获取此数据。在页面源的顶部,有一个看起来像

的标记
<meta property="zillow_fb:description" content="Zestimate&reg; Home Value: $10,037,734. "/>

您可以使用property属性找到该代码,并使用content获取['content']属性的值。为了得到这个价格,做一些简单的字符串拆分。

meta = soup.find('meta', property='zillow_fb:description')['content']
print(meta.split(':')[1])
#  $10,037,734. 

如果您不想要点.,则可以将其剥离。

答案 1 :(得分:2)

您可以使用selenium更好地模拟浏览器:

import re
from selenium import webdriver
d = webdriver.Chrome()
d.get('https://www.zillow.com/homedetails/5841-Round-Meadow-Rd-Hidden-Hills-CA-91302/19882656_zpid/')
result = re.findall('(?<=Home Value:\s)\$[\d,\s]+', d.page_source)[0]

输出:

u'$10,037,734'

答案 2 :(得分:0)

Zestimate是div class =“home-summary-row”中的第二个跨度。

美丽的汤使用:

row  = soup.findAll("div", {"class": "home-summary-row"})

然后你应该能够选择div的子项,或者按行解析。