Я просмотрел вопросы / ответы и попытался внести изменения в следующее, но безрезультатно.
Я пытаюсь вычистить страницы списков курсов из результатов Coursera «Анализ данных», https://www.coursera.org/browse/data-science/data-analysis?languages=en&page=1
.
Есть 9 страниц, каждая из которых содержит 25 курсов, и каждый курс находится подсобственный тег <h2>
.Я нашел некоторый успех со следующим кодом, но он не был согласованным:
courses_data_sci = []
for i in range(10):
page = "https://www.coursera.org/browse/data-science/data-analysis? languages=en&page=" + str(i)
html = urlopen(page)
soup = BeautifulSoup(html.read(), "html.parser")
for meta in soup.find_all('div', {'id' : 'rendered-content'}):
for x in range(26):
try:
course = meta.find_all('h2')[x].text.strip()
courses_data_sci.append(course)
except IndexError:
pass
Этот код, кажется, возвращает первые 2-3 страницы результатов и последнюю страницу результатов;иногда, если я запускаю его снова после очистки courses_data_sci
, он вернет 4-ю страницу результатов несколько раз.(Я работаю в Jupyter, и я перезапустил ядро, чтобы учесть все проблемы там.)
Я не уверен, почему код работает неправильно, не говоря уже о том, почему он возвращает несовместимыйРезультаты.
Любая помощь приветствуется.Спасибо.
ОБНОВЛЕНИЕ
Спасибо за идеи ... Я пытаюсь использовать оба варианта, чтобы заставить код работать.
Просто из любопытства, ясократил код, чтобы увидеть, что он собирал, имея в виду оба комментария.
courses_data_sci = []
session = requests.Session()
for i in range(10):
page = "https://www.coursera.org/browse/data-science/data-analysis? languages=en&page=" + str(i)
html = urlopen(page)
soup = BeautifulSoup(html.read(), "html.parser")
for meta in soup.find_all('div', {'id' : 'rendered-content'}):
course = meta.find_all('h2')
courses_data_sci.append(course)
# This is to check length of courses_data_sci across pages
print('Page: %s -- total length %s' % (i, len(courses_data_sci)))
В результате получается список списков, в котором содержит все курсы по всему9 страниц (и, конечно, информация href
, поскольку она еще не удалена).Каждый цикл создает один список на страницу: список всех курсов на соответствующей странице.Так что, похоже, я смогу убрать href
, пока списки выталкиваются в список, courses_data_sci
.
Есть 2 <h2>
тега на курс, поэтому я также думаю, что может быть проблема со вторым range()
вызовом: for x in range(26)
.Я пробовал несколько разных диапазонов, ни один из которых не работает или которые возвращают ошибку, «индекс вне диапазона».