我希望我的代码能够将{em> Zestimate 值关闭this page,以便我可以使用它(在本例中为10,037,774
)。我该怎么做呢?
答案 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® 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的子项,或者按行解析。