Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';t从奇怪的json内容中提取项目_Python_Json_Python 3.x_Web Scraping - Fatal编程技术网

Python Can';t从奇怪的json内容中提取项目

Python Can';t从奇怪的json内容中提取项目,python,json,python-3.x,web-scraping,Python,Json,Python 3.x,Web Scraping,我试图从json内容中获取一些项目。但是,json内容的结构对我来说是陌生的,因此我无法从中获取属性的值 到目前为止,我一直在尝试: import json import requests from bs4 import BeautifulSoup link = 'https://www.zillow.com/homedetails/5958-SW-4th-St-Miami-FL-33144/43835884_zpid/' def fetch_content(link): conte

我试图从json内容中获取一些项目。但是,json内容的结构对我来说是陌生的,因此我无法从中获取
属性的值

到目前为止,我一直在尝试:

import json
import requests
from bs4 import BeautifulSoup

link = 'https://www.zillow.com/homedetails/5958-SW-4th-St-Miami-FL-33144/43835884_zpid/'

def fetch_content(link):
    content = requests.get(link,headers={"User-Agent":"Mozilla/5.0"})
    soup = BeautifulSoup(content.text,"lxml")
    item = soup.select_one("script#hdpApolloPreloadedData").text
    print(json.loads(item)['apiCache'])

if __name__ == '__main__':
    fetch_content(link)
运行上述脚本的结果是:

{"VariantQuery{\"zpid\":43835884}":{"property":{"zpid":43835884,"streetAddress":"5958 SW 4th St",
我无法进一步处理前面那把奇怪的钥匙

预期产出:

{"zpid":43835884,"streetAddress":"5958 SW 4th St", ----

如何获取该属性的值?

您可以通过其损坏的json获取zpid和地址:

json.loads(json.loads(item.text)['apiCache'])['VariantQuery{"zpid":43835884}']['property']['zpid']                                                                                  
Out[1889]: 43835884

json.loads(json.loads(item.text)['apiCache'])['VariantQuery{"zpid":43835884}']['property']['streetAddress']                                                                         
Out[1890]: '5958 SW 4th St'
我注意到你总是可以得到这样的zpid:

link = 'https://www.zillow.com/homedetails/5958-SW-4th-St-Miami-FL-33144/43835884_zpid/'
content = requests.get(link,headers={"User-Agent":"Mozilla/5.0"})
soup = BeautifulSoup(content.text,"lxml")
item = soup.select_one("script#hdpApolloPreloadedData").text
print(json.loads(item)['zpid'])

您可以通过以下方式获得zpid和地址:

json.loads(json.loads(item.text)['apiCache'])['VariantQuery{"zpid":43835884}']['property']['zpid']                                                                                  
Out[1889]: 43835884

json.loads(json.loads(item.text)['apiCache'])['VariantQuery{"zpid":43835884}']['property']['streetAddress']                                                                         
Out[1890]: '5958 SW 4th St'
我注意到你总是可以得到这样的zpid:

link = 'https://www.zillow.com/homedetails/5958-SW-4th-St-Miami-FL-33144/43835884_zpid/'
content = requests.get(link,headers={"User-Agent":"Mozilla/5.0"})
soup = BeautifulSoup(content.text,"lxml")
item = soup.select_one("script#hdpApolloPreloadedData").text
print(json.loads(item)['zpid'])

只需将您的函数修改为以下内容。我还添加了另一个函数(
process\u fetched\u content()
)来给您更多的自由。您只需运行它,即使您有多个以
'VariantQuery{“zpid”:“
开头的键,它也会处理各种情况。最终输出是一个
dict
,其中键是您的
zpid
,值是您要查找的值

如果你有很多zpid值,那么这会让你把它们累加在一起,然后处理它们。好处是键列表就是你拥有的zpid列表

下面是如何使用此代码

输出

{'43835884': {'zpid': 43835884, 'streetAddress': '5958 SW 4th St', 'zipcode': '33144', 'city': 'Miami', 'state': 'FL', 'latitude': 25.76661, 'longitude': -80.292801, 'price': 340000, 'dateSold': 1576875600000, 'bathrooms': 2, 'bedrooms': 3, 'livingArea': 1757, 'yearBuilt': 1973, 'lotSize': 4331, 'homeType': 'SINGLE_FAMILY', 'homeStatus': 'RECENTLY_SOLD', 'photoCount': 19, 'imageLink': 'https://photos.zillowstatic.com/p_g/IS7yxihwtuqmlq1000000000.jpg', 'daysOnZillow': 0, 'isFeatured': False, 'shouldHighlight': False, 'brokerId': 0, 'zestimate': 341336, 'rentZestimate': 2200, 'listing_sub_type': {}, 'priceReduction': '', 'isUnmappable': False, 'rentalPetsFlags': 128, 'mediumImageLink': 'https://photos.zillowstatic.com/p_c/IS7yxihwtuqmlq1000000000.jpg', 'isPreforeclosureAuction': False, 'homeStatusForHDP': 'RECENTLY_SOLD', 'priceForHDP': 340000, 'festimate': 341336, 'isListingOwnedByCurrentSignedInAgent': False, 'isListingClaimedByCurrentSignedInUser': False, 'hiResImageLink': 'https://photos.zillowstatic.com/p_f/IS7yxihwtuqmlq1000000000.jpg', 'watchImageLink': 'https://photos.zillowstatic.com/p_j/IS7yxihwtuqmlq1000000000.jpg', 'tvImageLink': 'https://photos.zillowstatic.com/p_m/IS7yxihwtuqmlq1000000000.jpg', 'tvCollectionImageLink': 'https://photos.zillowstatic.com/p_l/IS7yxihwtuqmlq1000000000.jpg', 'tvHighResImageLink': 'https://photos.zillowstatic.com/p_n/IS7yxihwtuqmlq1000000000.jpg', 'zillowHasRightsToImages': True, 'desktopWebHdpImageLink': 'https://photos.zillowstatic.com/p_h/IS7yxihwtuqmlq1000000000.jpg', 'isNonOwnerOccupied': False, 'hideZestimate': False, 'isPremierBuilder': False, 'isZillowOwned': False, 'currency': 'USD', 'country': 'USA', 'taxAssessedValue': 224131, 'streetAddressOnly': '5958 SW 4th St', 'unit': ' '}}
密码
只需将您的函数修改为以下内容。我还添加了另一个函数(
process\u fetched\u content()
)来给您更多的自由。您只需运行它,即使您有多个以
VariantQuery{“zpid”开头的键,它也会处理各种情况:“
。最终输出是一个
dict
,其中键是您的
zpid
,值是您要查找的值

如果你有很多zpid值,那么这会让你把它们累加在一起,然后处理它们。好处是键列表就是你拥有的zpid列表

下面是如何使用此代码

输出

{'43835884': {'zpid': 43835884, 'streetAddress': '5958 SW 4th St', 'zipcode': '33144', 'city': 'Miami', 'state': 'FL', 'latitude': 25.76661, 'longitude': -80.292801, 'price': 340000, 'dateSold': 1576875600000, 'bathrooms': 2, 'bedrooms': 3, 'livingArea': 1757, 'yearBuilt': 1973, 'lotSize': 4331, 'homeType': 'SINGLE_FAMILY', 'homeStatus': 'RECENTLY_SOLD', 'photoCount': 19, 'imageLink': 'https://photos.zillowstatic.com/p_g/IS7yxihwtuqmlq1000000000.jpg', 'daysOnZillow': 0, 'isFeatured': False, 'shouldHighlight': False, 'brokerId': 0, 'zestimate': 341336, 'rentZestimate': 2200, 'listing_sub_type': {}, 'priceReduction': '', 'isUnmappable': False, 'rentalPetsFlags': 128, 'mediumImageLink': 'https://photos.zillowstatic.com/p_c/IS7yxihwtuqmlq1000000000.jpg', 'isPreforeclosureAuction': False, 'homeStatusForHDP': 'RECENTLY_SOLD', 'priceForHDP': 340000, 'festimate': 341336, 'isListingOwnedByCurrentSignedInAgent': False, 'isListingClaimedByCurrentSignedInUser': False, 'hiResImageLink': 'https://photos.zillowstatic.com/p_f/IS7yxihwtuqmlq1000000000.jpg', 'watchImageLink': 'https://photos.zillowstatic.com/p_j/IS7yxihwtuqmlq1000000000.jpg', 'tvImageLink': 'https://photos.zillowstatic.com/p_m/IS7yxihwtuqmlq1000000000.jpg', 'tvCollectionImageLink': 'https://photos.zillowstatic.com/p_l/IS7yxihwtuqmlq1000000000.jpg', 'tvHighResImageLink': 'https://photos.zillowstatic.com/p_n/IS7yxihwtuqmlq1000000000.jpg', 'zillowHasRightsToImages': True, 'desktopWebHdpImageLink': 'https://photos.zillowstatic.com/p_h/IS7yxihwtuqmlq1000000000.jpg', 'isNonOwnerOccupied': False, 'hideZestimate': False, 'isPremierBuilder': False, 'isZillowOwned': False, 'currency': 'USD', 'country': 'USA', 'taxAssessedValue': 224131, 'streetAddressOnly': '5958 SW 4th St', 'unit': ' '}}
密码
它现在可以工作,但是任何具有不同
zpid
的相同url肯定会失败,如
https://www.zillow.com/homedetails/907-24th-Ave-Seattle-WA-98122/48674590_zpid/
@robots.txt zpid似乎总是作为一个属性工作,我用它更新了。你真是令人难以置信@suppressionlayer。谢谢。一个小问题-如何使用c我将此设置为重复使用zpid。我尝试使用
item=['VariantQuery{“zpid”:f{uzpid}}]
其中
\uzpid
123456
。但是,结果是错误的格式。谢谢。你的意思是这样吗?f''VariantQuery{“zpid”:“{uzpid}”如果没有变量,则必须将它们加倍。它目前可以工作,但任何具有不同
zpid
的相同url肯定会失败,如
https://www.zillow.com/homedetails/907-24th-Ave-Seattle-WA-98122/48674590_zpid/
@robots.txt zpid似乎总是作为一个属性工作,我更新了它,这是不可能的。你真是不可思议@oppPressionLayer。谢谢。一个小问题-我如何格式化它以重用zpid。我尝试了
项=['VariantQuery{“zpid”:f{zpid}]
其中
\u zpid
123456
。但是,结果是一个错误的格式。谢谢。你的意思是这样吗?f''VariantQuery{“zpid”:“{zpid}”''如果没有变量,您必须将它们加倍。我还没有任何选项来运行您的脚本。我执行后会通知您。谢谢。我还没有任何选项来运行您的脚本。我执行后会通知您。谢谢。