Python抓取JSON - 获取所有项目

时间:2017-04-16 10:18:35

标签: python json beautifulsoup request web-crawler

我目前面临的问题是我无法从一个部分网站上获取我想要的信息。

详细地说,我想获得JSON中观光的所有项目和价格。

到目前为止,我能够获得所有价格,但缺乏得到所有项目。我刚刚收到一件特别的物品。

不确定是什么问题。

到目前为止,这是我的逻辑:

session = requests.Session()
session.cookies.get_dict()
url = 'http://www.citydis.com'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1)    AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
response = session.get(url, headers=headers)

soup = BeautifulSoup(response.content, "html.parser")
metaConfig = soup.find("meta",  property="configuration")


jsonUrl = "https://www.citydis.com/s/results.json?&q=London&   customerSearch=1&page=0"
js_dict = (json.loads(response.content.decode('utf-8')))


for item in js_dict:
   header = (js_dict['searchResults']["tours"])
   for titles in header:
       title_final = (titles.get("title"))



   url = (js_dict['searchResults']["tours"])
   for urls in url:
       url_final = (urls.get("url"))


   price = (js_dict['searchResults']["tours"])
   for prices in price:
       price_final = (prices.get("price")["original"])

       print("Header: " + title_final + " | " + "Price: " + price_final)

输出结果:

   Header: Ticket für Madame Tussauds London & Star-Wars-Erlebnis | Price: 83,66 €
 Header: Ticket für Madame Tussauds London & Star-Wars-Erlebnis | Price: 37,71 €
 Header: Ticket für Madame Tussauds London & Star-Wars-Erlebnis | Price: 152,01 €

正如大家们所看到的,价格显示正确,但项目(标题)没有差异。我刚刚收到一件特别的物品。

你可以帮帮我吗?任何反馈都表示赞赏。

2 个答案:

答案 0 :(得分:1)

你的for循环不正确。每个title_final只有1个(最后一个)prices in price,因此问题就出现了。

您可能想要这样做 -

for item in js_dict:
   headers = js_dict['searchResults']["tours"]
   prices = js_dict['searchResults']["tours"]

   for title, price in zip(headers, prices):
       title_final = titles.get("title")
       price_final = prices.get("price")["original"]
       print("Header: " + title_final + " | " + "Price: " + price_final)

答案 1 :(得分:1)

for titles in header:
    title_final = (titles.get("title"))

此代码运行,最后title_final只有一个值,代码继续进行下一步。 Python并没有神奇地跟踪分配给变量的所有值,然后将不同的for循环链接在一起。您需要在一个循环中执行所有操作或将数据存储在列表中,并将它们与zip或其他内容组合。

for item in js_dict:

您未使用item。你只是从循环中的字典中直接得到东西:

(js_dict['searchResults']["tours"])

你重复了三次,所以header == url == price

停下来思考你的代码。在这里和那里放置print语句,看看发生了什么以及变量的值是什么。