@vadimbespruzhny

Парсинг википедии с помощью Beautiful Soup?

Есть задача получить список всех животных каждой буквы русского алфавита. Использую BeautifulSoup. Смог обойти все буквы алфавита и получить с каждой страницы список животных, но сложность в том что внутри каждой буквы, может быть несколько страниц и нужно их все обойти. Основная проблема в том, что нумерация страниц не циферная, а "предыдущая страница" и "следующая страница" и в самом url нет инфы о том какой это номер страницы. Короче говоря я не могу сделать итерацию по страницам ибо не знаю ни кол-во страниц, ни ее номер. Уже все интернеты прогуглил, покажите пожалуйста на примере кода, или хотя бы куда копать...

вот пример того, что я пытаюсь сделать

def get_html():
    url = "https://ru.wikipedia.org/wiki/Категория:Животные_по_алфавиту"
    get_page = requests.get(url).text
    return get_page


def get_subcategories():
    page = get_html()
    soup = BeautifulSoup(page, 'lxml')
    subcategories = []
    letters = soup.find('div', class_='toccolours plainlinks center').find('span').find_all('a')
    for letter in letters:
        subcategories.append(letter.get('href'))
    return subcategories


def get_data():
    animals = []
    subcategories = get_subcategories()
    for category in subcategories:
        url = requests.get(category).text
        soup = BeautifulSoup(url, 'lxml')
        names = soup.find(
            'div', class_='mw-content-ltr').find('div', class_='mw-category-group').find_all('a')
        for i in names:
            animals.append(i.text)
    return animals
  • Вопрос задан
  • 1839 просмотров
Решения вопроса 1
Wispik
@Wispik
В цикле while ищешь ссылку с title="Следующая страница" и пока она есть, переходишь по ней и парсишь
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
shurshur
@shurshur
Сисадмин, просто сисадмин...
Википедия, в отличие от большинства сайтов, не ставит задачу сокрытия данных от использования. Кроме её парсинга полезно рассмотреть альтернативные способы:

1. Парсинг дампов SAX-парсером: https://dumps.wikimedia.org/ruwiki/latest/

Главное в тексте находить нужные категории.

2. Использование SPARQL к Wikidata: https://query.wikidata.org/

Например, я наскоро набросал такой запрос, находящий все элементы субклассов "животное":

select ?animal ?animalLabel where {
# субкласс (wdt:P729) животного (wd:Q729)
  ?animal wdt:P279 ?animalSubClass.
  ?animalSubClass wdt:P279* wd:Q729.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en". }
}


К сожалению, не всегда данные в Википедии хорошо размечены семантически, поэтому в подобную выборку может попасть не всё. Ну и полно будет извлечено из enwiki.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы