मैंने यह कोड लिखा था, लेकिन अंतिम पंक्ति को चलाने के बाद इसे "इंडेक्स एरर: लिस्ट इंडेक्स आउट ऑफ रेंज" त्रुटि के रूप में मिला। कृपया, मैं इसे कैसे ठीक करूं?

    import requests
    from bs4 import BeautifulSoup

    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, 
                                           like Gecko) Chrome/61.0.3163.100 Safari/537.36'}
    response = requests.get("https://www.zomato.com/bangalore/top-restaurants",headers=headers)

    content = response.content
    soup = BeautifulSoup(content,"html.parser")

    top_rest = soup.find_all("div",attrs={"class": "sc-bblaLu dOXFUL"})
    list_tr = top_rest[0].find_all("div",attrs={"class": "sc-gTAwTn cKXlHE"})

list_rest =[]
for tr in list_tr:
    dataframe ={}
    dataframe["rest_name"] = (tr.find("div",attrs={"class": "res_title zblack bold nowrap"})).text.replace('\n', ' ')
    dataframe["rest_address"] = (tr.find("div",attrs={"class": "nowrap grey-text fontsize5 ttupper"})).text.replace('\n', ' ')
    dataframe["cuisine_type"] = (tr.find("div",attrs={"class":"nowrap grey-text"})).text.replace('\n', ' ')
    list_rest.append(dataframe)
list_rest
-1
SmatRalph 26 मार्च 2020, 04:05

3 जवाब

आपको यह त्रुटि इसलिए प्राप्त हो रही है क्योंकि जब आप इसका पहला तत्व प्राप्त करने का प्रयास करते हैं तो top_rest खाली होता है "top_rest[0]"। इसका कारण यह है कि जिस प्रथम श्रेणी को आप संदर्भित करने का प्रयास कर रहे हैं उसे गतिशील रूप से नामित किया गया है। आप देखेंगे कि यदि आप पृष्ठ को रीफ्रेश करते हैं तो उस div के उसी स्थान का नाम वही नहीं होगा। इसलिए जब आप परिमार्जन करने का प्रयास करते हैं तो आपको खाली परिणाम मिलते हैं।

एक विकल्प सभी divs को स्क्रैप करना होगा, फिर अपने इच्छित तत्वों पर संकीर्ण होना चाहिए, गतिशील div नामकरण स्कीमा से सावधान रहें ताकि एक अनुरोध से दूसरे अनुरोध से आपको अलग-अलग परिणाम मिलेंगे:

import requests
from bs4 import BeautifulSoup

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}
response = requests.get("https://www.zomato.com/bangalore/top-restaurants",headers=headers)

content = response.content
soup = BeautifulSoup(content,"html.parser")

top_rest = soup.find_all("div")
list_tr = top_rest[0].find_all("div",attrs={"class": "bke1zw-1 eMsYsc"})
list_tr
0
Ian-Fogelman 26 मार्च 2020, 04:28
मैंने कोशिश की और सूची तत्वों तक पहुंचने की कोशिश की यानी एक रेस्तरां की जानकारी एक-एक करके संपादित कोड में इस कोड के साथ लूप का उपयोग करके 'जिसके बाद आपने जवाब देने में मदद की'। मुझे खेद है कि यह बुनियादी लग सकता है लेकिन मैं वेबस्क्रैपिंग के लिए नया हूं और मैंने वास्तविक जीवन परियोजनाओं पर अपना हाथ रखने का फैसला किया है।
 – 
SmatRalph
26 मार्च 2020, 13:33

वेब स्क्रैपिंग लैंग्वेज का उपयोग करके मैं इसे लिखने में सक्षम था:

GOTO https://www.zomato.com/bangalore/top-restaurants
EXTRACT {'rest_name': '//div[@class="res_title zblack bold nowrap"]', 
         'rest_address': '//div[@class="nowrap grey-text fontsize5 ttupper', 
         'cusine_type': '//div[@class="nowrap grey-text"]'} IN //div[@class="bke1zw-1 eMsYsc"]

यह प्रत्येक रिकॉर्ड तत्व पर कक्षा bke1zw-1 eMsYsc और पुल . के साथ पुनरावृति करेगा प्रत्येक रेस्तरां जानकारी।

-1
user299709 17 अप्रैल 2020, 01:01

मैंने हाल ही में एक प्रोजेक्ट किया जिसने मुझे मनीला, फिलीपींस में ज़ोमैटो की वेबसाइट को खंगालने के लिए शोध किया। मैंने मनीला सिटी के देशांतर और अक्षांश मान प्राप्त करने के लिए जियोलाइब्रेरी का उपयोग किया, फिर इस जानकारी का उपयोग करके रेस्तरां के विवरण को स्क्रैप किया। जोड़ें: आप एक दिन में 1000 कॉल तक करने के लिए ज़ोमैटो वेबसाइट पर अपनी स्वयं की एपीआई कुंजी प्राप्त कर सकते हैं।

# Use geopy library to get the latitude and longitude values of Manila City.
from geopy.geocoders import Nominatim

address = 'Manila City, Philippines'
geolocator = Nominatim(user_agent = 'Makati_explorer')
location = geolocator.geocode(address)
latitude = location.lenter code hereatitude
longitude = location.longitude
print('The geographical coordinate of Makati City are {}, {}.'.format(latitude, longitude))

# Use Zomato's API to make call
headers = {'user-key': '617e6e315c6ec2ad5234e884957bfa4d'}
venues_information = []

for index, row in foursquare_venues.iterrows():
    print("Fetching data for venue: {}".format(index + 1))
    venue = []
    url = ('https://developers.zomato.com/api/v2.1/search?q={}' + 
          '&start=0&count=1&lat={}&lon={}&sort=real_distance').format(row['name'], row['lat'], row['lng'])
    try:
        result = requests.get(url, headers = headers).json()
    except:
        print("There was an error...")
    try:

        if (len(result['restaurants']) > 0):
            venue.append(result['restaurants'][0]['restaurant']['name'])
            venue.append(result['restaurants'][0]['restaurant']['location']['latitude'])
            venue.append(result['restaurants'][0]['restaurant']['location']['longitude'])
            venue.append(result['restaurants'][0]['restaurant']['average_cost_for_two'])
            venue.append(result['restaurants'][0]['restaurant']['price_range'])
            venue.append(result['restaurants'][0]['restaurant']['user_rating']['aggregate_rating'])
            venue.append(result['restaurants'][0]['restaurant']['location']['address'])
            venues_information.append(venue)
        else:
            venues_information.append(np.zeros(6))
    except:
        pass

ZomatoVenues = pd.DataFrame(venues_information, 
                                  columns = ['venue', 'latitude', 
                                             'longitude', 'price_for_two', 
                                             'price_range', 'rating', 'address'])
0
SmatRalph 6 जून 2020, 13:05