Код просто печатает одни и те же адреса электронной почты снова и снова и не переходит на следующую страницу. Кто-нибудь видит ошибку в моем коде?
import requests
from bs4 import BeautifulSoup as soup
def get_emails(_links:list):
for i in range(len(_links)):
new_d = soup(requests.get(_links[i]).text, 'html.parser').find_all('a', {'class':'my_modal_open'})
if new_d:
yield new_d[-1]['title']
start=20
while True:
d = soup(requests.get('http://www.schulliste.eu/type/gymnasien/?bundesland=&start=20').text, 'html.parser')
results = [i['href'] for i in d.find_all('a')][52:-9]
results = [link for link in results if link.startswith('http://')]
print(list(get_emails(results)))
next_page=d.find('div', {'class': 'paging'}, 'weiter')
if next_page:
d=next_page.get('href')
start+=20
else:
break
Когда вы нажимаете кнопку «weiter» (следующая страница), URL-адрес меняется с «... start = 20» на «start = 40». Это 20 шагов, потому что на каждом сайте есть 20 результатов.






Проблема с URL-адресом, который вы запрашиваете. Каждый раз запрашивается один и тот же URL-адрес, потому что вы не обновляете URL-адрес в соответствии с начальным значением, которое вы рассчитываете. Попробуйте изменить URL-адрес следующим образом:
'http://www.schulliste.eu/type/gymnasien/?bundesland=&start = {}'.format(start)
Если вы можете поделиться описанием вашей ошибки ... Эта строка кода не вызовет ошибку отступа. В вашем коде должна быть какая-то ошибка отступа, просто посмотрите номер строки, на которую она указывает.
Предполагая, что next_page что-то возвращает, проблема в том, что вы пытаетесь сделать одно и то же дважды за один раз, но ни то, ни другое не выполняется должным образом:
1.) Вы пытаетесь указать d на следующую страницу, но все же в начале цикла вы снова переназначаете d на стартовую страницу.
2.) Вы пытаетесь назначить start+=20 для следующей страницы, но вы не ссылаетесь на start ни в одной части вашего кода.
1.) Переместите назначение d за пределы цикла и полностью удалите объект start:
# start=20
# You don't need start because it's not being used at all
# move the initial d assignment outside the loop
d = soup(requests.get('http://www.schulliste.eu/type/gymnasien/?bundesland=&start=20').text, 'html.parser')
while True:
# rest of your code
if next_page:
d=next_page.get('href')
# start+=20
# Again, you don't need the start any more.
else:
break
2.) Нет необходимости переназначать d, просто укажите start в своем URL-адресе в начале цикла и удалите назначение d в if next_page:
start=20
while True:
d = soup(requests.get('http://www.schulliste.eu/type/gymnasien/?bundesland=&start = {page_id}'.format(page_id=start).text, 'html.parser')
# rest of your code
if next_page:
# d=next_page.get('href')
# this d assignment is redundant as it will get reassigned in the loop. Start is your key.
start+=20
else:
break
Я получаю эту ошибку с вашим кодом: IndentationError: ожидается блок с отступом
Ошибка довольно наглядная, не так ли? Проверьте блоки отступов, чтобы убедиться, что вы делаете отступы правильно.
Я новичок в Python ... но все равно получаю сообщение об ошибке: неверный синтаксис
Мой код сейчас: запросы на импорт из bs4 import BeautifulSoup as soup def get_emails (_links: list): for i in range (len (_links)): new_d = soup (requests.get (_links [i]). Text, 'html. parser '). find_all (' a ', {' class ':' my_modal_open '}) if new_d: yield new_d [-1] [' title '] start = 20 while True: d = soup (requests.get (' schulliste.eu/type/gymnasien/?bundesland= & start = {page_id} '. fo rmat (page_id = start) . text,' html.parser ') # остальная часть вашего кода if next_page: start + = 20 else: break
... # rest of your code предназначен для того, чтобы вы вставляли свой код, а не просто копировали и вставляли его. Я внес изменения только в соответствующую часть, вам нужно понять изменения и объединить их с существующим кодом. К сожалению, если вы не можете этого сделать, у вас гораздо более серьезная проблема, чем ваш первоначальный вопрос.
конечно, я понял.
Я получаю эту ошибку с вашим кодом: IndentationError: ожидается блок с отступом