Веб-парсинг Python перейти на следующую страницу

Код просто печатает одни и те же адреса электронной почты снова и снова и не переходит на следующую страницу. Кто-нибудь видит ошибку в моем коде?

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 результатов.

Почему в 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
0
2 573
2

Ответы 2

Проблема с URL-адресом, который вы запрашиваете. Каждый раз запрашивается один и тот же URL-адрес, потому что вы не обновляете URL-адрес в соответствии с начальным значением, которое вы рассчитываете. Попробуйте изменить URL-адрес следующим образом:

'http://www.schulliste.eu/type/gymnasien/?bundesland=&start = {}'.format(start)

Я получаю эту ошибку с вашим кодом: IndentationError: ожидается блок с отступом

NorGer 09.10.2018 17:00

Если вы можете поделиться описанием вашей ошибки ... Эта строка кода не вызовет ошибку отступа. В вашем коде должна быть какая-то ошибка отступа, просто посмотрите номер строки, на которую она указывает.

Ni3_k 10.10.2018 12:30

Предполагая, что 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: ожидается блок с отступом

NorGer 09.10.2018 16:57

Ошибка довольно наглядная, не так ли? Проверьте блоки отступов, чтобы убедиться, что вы делаете отступы правильно.

r.ook 09.10.2018 17:03

Я новичок в Python ... но все равно получаю сообщение об ошибке: неверный синтаксис

NorGer 09.10.2018 17:27

Мой код сейчас: запросы на импорт из 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

NorGer 09.10.2018 17:29

... # rest of your code предназначен для того, чтобы вы вставляли свой код, а не просто копировали и вставляли его. Я внес изменения только в соответствующую часть, вам нужно понять изменения и объединить их с существующим кодом. К сожалению, если вы не можете этого сделать, у вас гораздо более серьезная проблема, чем ваш первоначальный вопрос.

r.ook 09.10.2018 17:32

конечно, я понял.

NorGer 09.10.2018 17:56

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