использование красивого супа для получения консолидированных данных из списка URL-адресов вместо только первого URL-адреса

#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. БОЛЬШОЕ ВАМ СПАСИБО!!! Я боролась с этим так сильно, что готова была заплакать. Спасибо!!