#python #web-scraping #beautifulsoup
#питон #соскабливание паутины #прекрасный суп
Вопрос:
Я пытаюсь получить данные трех состояний, основанные на одном и том же формате URL.
states = ['123', '124', '125'] urls = [] for state in states: url = f'www.something.com/geo={state}' urls.append(url)
и оттуда у меня есть три отдельных URL-адреса, каждый из которых содержит разные идентификаторы состояния.
Однако, когда я приступаю к его обработке через BS, на выходе отображаются только данные из состояния 123.
for url in urls: client = ScrapingBeeClient(api_key="API_KEY") response = client.get(url) doc = BeautifulSoup(response.text, 'html.parser')
впоследствии я извлек нужные мне столбцы, используя это:
listings = doc.select('.is-9-desktop') rows = [] for listing in listings: row = {} try: row['name'] = listing.select_one('.result-title').text.strip() except: print("no name") try: row['add'] = listing.select_one('.address-text').text.strip() except: print("no add") try: row['mention'] = listing.select_one('.review-mention-block').text.strip() except: pass rows.append(row)
Но, как уже упоминалось, он показывал данные только для штата 123. Очень признателен, если кто-нибудь даст мне знать, где я ошибся, спасибо!
Редактировать
Я добавил вывод URL-адреса в список и смог получить данные для всех трех состояний.
doc = [] for url in urls: client = ScrapingBeeClient(api_key="API_KEY") response = client.get(url) docs = BeautifulSoup(response.text, 'html.parser') doc.append(docs)
Однако, когда я запустил его через BS, это привело к сообщению об ошибке:
Ошибка атрибута: объект «список» не имеет атрибута select.
Прогоняю ли я его через другой цикл?
Комментарии:
1.
rows=[]
должно быть сначала, когда вы просматриваете список URL-адресов2.
url = f'www.something.com/geo={states}'
должно бытьurl = f'www.something.com/geo={state}'
3. @The_spider для меня оба выглядят одинаково!
4. состояния преобразуется в состояние
5. вы сбрасываете строки каждый раз при использовании
rows=[]
. Это должно быть вне вашей петли.
Ответ №1:
Ему не нужны все эти циклы — просто повторите состояния и получите списки для добавления в строки.
Самое главное, что rows=[]
находится за пределами циклов for, чтобы остановить его перезапись.
Пример
states = ['123', '124', '125'] rows = [] for state in states: url = f'www.something.com/geo={states}' client = ScrapingBeeClient(api_key="API_KEY") response = client.get(url) doc = BeautifulSoup(response.text, 'html.parser') listings = doc.select('.is-9-desktop') for listing in listings: row = {} try: row['name'] = listing.select_one('.result-title').text.strip() except: print("no name") try: row['add'] = listing.select_one('.address-text').text.strip() except: print("no add") try: row['mention'] = listing.select_one('.review-mention-block').text.strip() except: pass rows.append(row)
Комментарии:
1. БОЛЬШОЕ ВАМ СПАСИБО!!! Я боролась с этим так сильно, что готова была заплакать. Спасибо!!