Python / BeautifulSoup Web-scraping Проблема - нерегулярные возвращения - PullRequest
0 голосов
/ 22 мая 2018

Я просмотрел вопросы / ответы и попытался внести изменения в следующее, но безрезультатно.

Я пытаюсь вычистить страницы списков курсов из результатов 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).Я пробовал несколько разных диапазонов, ни один из которых не работает или которые возвращают ошибку, «индекс вне диапазона».

1 Ответ

0 голосов
/ 22 мая 2018

Я получаю то же поведение, используя ваш код.

Я изменил его, чтобы использовать запросы:

from bs4 import BeautifulSoup
import requests

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 = session.get(page)
    soup = BeautifulSoup(html.text, "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

    # This is to check length of courses_data_sci across pages
    print('Page: %s  -- total length %s' % (i, len(courses_data_sci)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...