(Python) Словарь В списке выдает ошибку «IndexError: индекс списка вне диапазона»

[{'url': '/apartments/san-francisco-ca/923-folsom/5Yy6Np/'}, {'url': 'https://www.zillow.com/apartments/san-francisco-ca/the-brady/C4XYzK/'}, {'url': 'https://www.zillow.com/apartments/san-francisco-ca/northpoint-apartments/5XjLPJ/'}, {'url': 'https://www.zillow.com/b/747-geary-street-oakland-ca-CYzGVt/'}, {'url': '/apartments/san-francisco-ca/edgewater/5XjVQc/'}, {'url': '/apartments/san-francisco-ca/1188-mission-at-trinity-place/5XjN4q/'}]

это вывод файлов self.results, это список, len дает 6 элементов, я хочу получить «url» внутри словаря

import requests
from bs4 import BeautifulSoup
import json
from selenium import webdriver
import time
params = {
    'searchQueryState': '{"mapBounds":{"north":42.009517,"east":-114.131253,"south":32.528832,"west":-124.482045},"mapZoom":5,"isMapVisible":true,"filterState":{"price":{"max":872627},"beds":{"min":1},"fore":{"value":false},"mp":{"max":3000},"auc":{"value":false},"nc":{"value":false},"fr":{"value":true},"fsbo":{"value":false},"cmsn":{"value":false},"fsba":{"value":false}},"isListVisible":true,"regionSelection":[{"regionId":9,"regionType":2}],"usersSearchTerm":"California","schoolId":null}'
 }



class ZillowScraper():
    results=[]
    headers= {
    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'Accept-Encoding':'gzip, deflate, br',
    'Accept-Language':'tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7',
    'Cache-Control':'max-age=0',
    'Cookie':'zguid=24|%249e975354-f675-419d-88e1-268640260ac4; _ga=GA1.2.124390097.1686931595; zjs_anonymous_id=%229e975354-f675-419d-88e1-268640260ac4%22; zg_anonymous_id=%2262a63b50-344d-4671-880c-04d453844549%22; _pxvid=c4d5254a-0c5f-11ee-9b64-15b9a4b973bd; _gcl_au=1.1.80251162.1686931598; __pdst=38dc54a14928440ea9e18bce80e1ec08; _fbp=fb.1.1686931597756.1157135805; _pin_unauth=dWlkPU9EVXhZelF4WmpZdE4yWXhNaTAwTTJReUxUaGhZVEl0TlRaak1tRXpZamxsTldWbA; g_state = {"i_l":0}; userid=X|3|3dbd58da0e59b75f%7C2%7Cq9T-1RNvuHMHNFQyWSbr7sl7mTb0P-i9btbmtnsodtE%3D; loginmemento=1|2fd5fb94fc32e42f5344da80f8f13e75986fad0f163b2c5704da1ff0eae2afb6; zjs_user_id=%22X1-ZUrfq9bm176tc9_1zmzs%22; JSESSIONID=973ED705C2EDB91A7BF10D85CDFF5814; zgsession=1|3c6828c5-3e67-4639-9972-fd4736403a62; ZILLOW_SID=1|AAAAAVVbFRIBVVsVEjg1bj1MjO6GG9oxT7XzrfvIXY2RKMzKEvaz6DaBCZtWJSCGtWGKfElpHr957F4KqyLOxAtmIUA1BizCKg; _gid=GA1.2.1380352076.1688718740; pxcts=ca98aaaa-1ca0-11ee-b480-616f51557753; DoubleClickSession=true; _clck=1uqa94j|2|fd3|0|1262; tfpsi=dcb016eb-2d99-44e8-a777-9a8a6050caaf; _uetsid=333808901ca211eeab4a1f19a5284c94; _uetvid=c5ebbf500c5f11eeb6c3c9c655f631e0; _px3=9c5cade37141a8e60d6380f6a9cfb3c9330d4e390ed91edd6b011cb63e92933d:d7C2qYwntLRbpcZy/DTjqpGCduzy+AH7I9u+VkVNCzM4wMXrOL7OP2R//DfgEP1kRn1hrxo8uUkl8Opv4tdx3w==:1000:cS+n8Og6wNAKCZwozMRKoLCCrdTzCbVArgT+vhD5SwsRuMYxwoRCaJL7Y1Y8iIp2j1ARVrm9eNWUlJykb5sPuC1PxrsMJodXAyq9y7PFy4qFgv5GdyFWvmV0E2asllfSbIp15P9L4sGP8A+qTuFB5snLuOo5NWZidGglE+KYRQx0gieWD2BkI4BQjN3DnrU1bJRUa9+omJnH1zphmhIJ4w==; __gads=ID=0789e8e54f1dec08:T=1686931597:RT=1688720215:S=ALNI_MaqX2esiAR8pEZ2TAX0dGHUBNSrdA; __gpi=UID=00000c2fceeb5fe3:T=1686931597:RT=1688720215:S=ALNI_MaGvh-b1S5JJXngtBs3-TQBlDKz_w; _gat=1; _clsk=1gz2p94|1688720278842|12|0|s.clarity.ms/collect; AWSALB=MKF/saKP1r0geqVVfYxmvBt8BXaElPu2UvRc+unjgOvJ0lVSdn2+oATj6UI10oWkuLKOz9thWJZkdY+XiON9bnmZojeR0r3c11rEA6oSYhi1bOO/QS35UIMVD83K; AWSALBCORS=MKF/saKP1r0geqVVfYxmvBt8BXaElPu2UvRc+unjgOvJ0lVSdn2+oATj6UI10oWkuLKOz9thWJZkdY+XiON9bnmZojeR0r3c11rEA6oSYhi1bOO/QS35UIMVD83K; search=6|1691312278512%7Crect%3D42.009517%252C-114.131253%252C32.528832%252C-124.482045%26rid%3D9%26disp%3Dmap%26mdm%3Dauto%26p%3D1%26z%3D0%26listPriceActive%3D1%26beds%3D1-%26price%3D0-872627%26mp%3D0-3000%26fs%3D0%26fr%3D1%26mmm%3D0%26rs%3D0%26ah%3D0%26singlestory%3D0%26housing-connector%3D0%26abo%3D0%26garage%3D0%26pool%3D0%26ac%3D0%26waterfront%3D0%26finished%3D0%26unfinished%3D0%26cityview%3D0%26mountainview%3D0%26parkview%3D0%26waterview%3D0%26hoadata%3D1%26zillow-owned%3D0%263dhome%3D0%26featuredMultiFamilyBuilding%3D0%26excludeNullAvailabilityDates%3D0%26commuteMode%3Ddriving%26commuteTimeOfDay%3Dnow%09%09%09%7B%22isList%22%3Atrue%2C%22isMap%22%3Atrue%7D%09%09%09%09%09',

    'Sec-Ch-Ua':'"Not.A/Brand";v = "8", "Chromium";v = "114", "Google Chrome";v = "114"',
    'Sec-Ch-Ua-Mobile':'?0',
    'Sec-Ch-Ua-Platform':'"Windows"',
    'Sec-Fetch-Dest':'document',
    'Sec-Fetch-Mode':'navigate',
    'Sec-Fetch-Site':'same-origin',
    'Sec-Fetch-User':'?1',
    'Upgrade-Insecure-Requests':'1',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36}'
    }
    
    def fetch(self,url,params):
        response = requests.get(url,headers=self.headers, params=params)
        print(response)
        return response

    def parse(self, response):
        content = BeautifulSoup(response,features='html.parser')
        deck = content.find('ul', {'class': 'List-c11n-8-89-0__sc-1smrmqp-0 StyledSearchListWrapper-srp__sc-1ieen0c-0 kZyCWU fgiidE photo-cards'})
        for card in deck.contents[0]:
            script = card.find('script',{'type': 'application/ld+json'})
            if script:
                
                script_json = json.loads(script.contents)
                print(script_json)
                try:
                    self.results.append({
                        'latitude': script_json['geo']['latitude'],
                        'longtitude': script_json['json']['longtitude'],
                        'context': script_json['floorSize']['value'],
                        'url': script_json['url']
                    })
                except KeyError:
                    self.results.append({
                        'url': script_json['url']
                        
                    })
                print(script_json['url'])
                
            
            else:
                article= card.find('article',{'role':'presentation'})
                if article is None:
                    continue
                else:
                    script=article.find('address',{'data-test':'property-card-addr'})
                    if script:
                        print(script.prettify())
                        pass
                    else:
                        return
            print(self.results)
            #print(type(self.results[0]))
            print(self.results)
            #if "http" not in self.results[0]{'url'}:
               # self.results[-1]{'url'}=f"https://zillow.com{self.results[0]{'url'}}" 
            print(self.results)
            
    def run(self):
        url = "https://www.zillow.com/san-francisco-ca/rentals/?searchQueryState=%7B%22pagination%22%3A%7B%7D%2C%22mapBounds%22%3A%7B%22north%22%3A37.88007392999709%2C%22east%22%3A-122.09541072195475%2C%22south%22%3A37.59118324417655%2C%22west%22%3A-122.823254960236%7D%2C%22usersSearchTerm%22%3A%22California%22%2C%22regionSelection%22%3A%5B%7B%22regionId%22%3A20330%2C%22regionType%22%3A6%7D%5D%2C%22isMapVisible%22%3Atrue%2C%22filterState%22%3A%7B%22price%22%3A%7B%22max%22%3A872627%7D%2C%22beds%22%3A%7B%22min%22%3A1%7D%2C%22fore%22%3A%7B%22value%22%3Afalse%7D%2C%22mp%22%3A%7B%22max%22%3A3000%7D%2C%22auc%22%3A%7B%22value%22%3Afalse%7D%2C%22nc%22%3A%7B%22value%22%3Afalse%7D%2C%22fr%22%3A%7B%22value%22%3Atrue%7D%2C%22fsbo%22%3A%7B%22value%22%3Afalse%7D%2C%22cmsn%22%3A%7B%22value%22%3Afalse%7D%2C%22fsba%22%3A%7B%22value%22%3Afalse%7D%7D%2C%22isListVisible%22%3Atrue%7D"
        params = {
            'searchQueryState': '{"mapBounds":{"north":42.009517,"east":-114.131253,"south":32.528832,"west":-124.482045},"mapZoom":5,"isMapVisible":true,"filterState":{"price":{"max":872627},"beds":{"min":1},"fore":{"value":false},"mp":{"max":3000},"auc":{"value":false},"nc":{"value":false},"fr":{"value":true},"fsbo":{"value":false},"cmsn":{"value":false},"fsba":{"value":false}},"isListVisible":true,"regionSelection":[{"regionId":9,"regionType":2}],"usersSearchTerm":"California","schoolId":null}'
            }
        res= self.fetch(url,params)
        self.parse(res.text)

if __name__== '__main__':
    scraper = ZillowScraper()
    scraper.run()

Я попытался добраться до словаря и извлечь содержимое элементов URL для сравнения с моими собственными желаемыми значениями http, но не смог получить индексы, хотя тип представляет собой список и включает 6 элементов.

Редактировать Я пытался опубликовать полный код, но возникают проблемы с отступами, хотя я нажимаю ctrl+K

Выслеживать:

Traceback (most recent call last):   File "C:\Users\Kubilay
> Kaan\Documents\Dev_Projects\python_projects\Python_Sketchs\zillow_class_oriented.py",
> line 89, in <module>
>     scraper.run()   File "C:\Users\Kubilay Kaan\Documents\Dev_Projects\python_projects\Python_Sketchs\zillow_class_oriented.py",
> line 85, in run
>     self.parse(res.text)   File "C:\Users\Kubilay Kaan\Documents\Dev_Projects\python_projects\Python_Sketchs\zillow_class_oriented.py",
> line 73, in parse
>     print(type(self.results[0])) IndexError: list index out of range

Я не знаю, поможет ли это, но это превращает список словарей в плоский список URL-адресов: urls = [dct["url"] for dct in list_of_dicts]

juanpethes 10.07.2023 17:37

@9769953 Я сделал это

kubi_learns_things 10.07.2023 17:47

измените script.contents[0] на script.contents и посмотрите, что вы получаете.

Zero 10.07.2023 17:54

Действительно ли def run находится внутри цикла for? Почему?

Barmar 10.07.2023 17:54

Вы получите эту ошибку, если self.results пусто, что произойдет при сбое if script:.

Barmar 10.07.2023 17:58

@Barmar нет, это под отступом класса, но я не могу опубликовать полный код, ctrl K не работает

kubi_learns_things 10.07.2023 18:00

@Barmar поднять TypeError(f'объект JSON должен быть str, bytes или bytearray, ' TypeError: объект JSON должен быть str, bytes или bytearray, а не список, когда я удаляю 0

kubi_learns_things 10.07.2023 18:01

self.results дает мне [{'url': '/apartments/san-francisco-ca/923-folsom/5Yy6Np/'}, {'url': 'zillow.com/apartments/san-francisco-ca/ the-brady/C4XYzK '}, {'url': ' zillow.com/apartments/san-francisco-ca/northpoint-apartment‌​s/… '}, {'url': ' zillow. com/b/747-geary-street-oakland-ca-CYzGVt'}, {'url': '/квартиры/сан-франциско-ca/edgewater/5XjVQc/'}, {'url': '/квартиры/ san-francisco-ca/1188-mission-at-trinity-place/‌​5XjN4q/'}] у меня нет проблем с доступом к содержимому

kubi_learns_things 10.07.2023 18:02

Я не понимаю, о чем ваш второй ответ мне. Я не предлагал каких-либо изменений, которые могли бы вызвать TypeError. Это было из-за предложения Зеро?

Barmar 10.07.2023 18:04

О, мой плохой @Barmar, это был ответ Зеро, я мог бы добавить в него весь свой код, теперь вы можете проверить его снова, если сначала это не имело смысла, и проблема была решена с ответом ниже, я специально спасибо за ваши усилия, пока я стараюсь изо всех сил адаптировать сайт.

kubi_learns_things 10.07.2023 18:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
10
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы пытаетесь получить доступ к значениям словаря в списке, но может возникнуть проблема с вашим методом индексации. Основываясь на вашем коде, если вы хотите получить доступ к каждому значению «url» в словарях, хранящихся в self.results, вы должны пройти через self.results.

Ниже приведен пример того, как вы можете получить доступ к «url» в словарях и изменить его, если «http» не находится в «url»:

for result in self.results:          #'result' is a dict and 'results' are a list
    if "http" not in result['url']:  # here 'result' is a dictionary
        result['url'] = f"https://www.zillow.com{result['url']}"

Этот блок кода перебирает каждый словарь в self.results (список) и проверяет, является ли «http» частью значения «url». Если нет, он добавляет «URL» с «https://www.zillow.com». Обратите внимание, что это напрямую изменит self.results. Изменения вносятся на месте, то есть изменяются исходные результаты self.results. Если вам нужны исходные данные, подумайте о том, чтобы сделать копию, прежде чем вносить изменения. Я думаю, вы могли по ошибке использовать фигурные скобки, чтобы попытаться получить доступ к ключу dict. Возможно, используйте квадратные скобки.

Вам нужно убедиться, что ваши URL-адреса правильно объединены. Если пути в «url» начинаются с «/», вы можете закончить с «//» в вашем объединенном URL-адресе. Если пути не начинаются с «/», ваш код должен работать должным образом.

Я также иногда использую метод .get() для получения элементов из объекта json, если обычная индексация не работает. Пример:

car = {
  "brand": "Ford",
  "model": "Mustang",
  "year": 1964,
  "price": 10234
}
x = car.get("price")
print(x) # should return 10234 as integer.

Кроме того, я заметил, что вы изо всех сил пытались красиво отформатировать код. Вы можете нажать кнопку с фигурными скобками в редакторе Stack Overflow, чтобы отформатировать код в формате блока кода (4 пробела добавляются перед каждой строкой, тогда Stack Overflow знает, что нужно поместить все в блок кода для более удобного отображения).

Это решило мою проблему, большое вам спасибо! Хорошего дня!

kubi_learns_things 10.07.2023 18:11

Рад, что это сработало! Вам тоже хорошего дня.

Dieter van der Westhuizen 10.07.2023 18:13

Другие вопросы по теме