Как отсканировать все статьи определенной категории от New York Times - PullRequest
1 голос
/ 05 ноября 2019

Мне нужно иметь возможность почистить содержание многих статей определенной категории из New York Times. Например, скажем, мы хотим посмотреть на все статьи, связанные с «терроризмом». Я бы пошел по этой ссылке, чтобы просмотреть все статьи: https://www.nytimes.com/topic/subject/terrorism

Отсюда я могу нажимать на отдельные ссылки, которые направляют меня на URL, который я могу почистить. Я использую Python с пакетом BeautifulSoup, чтобы помочь мне получить текст статьи.

Вот код, который у меня есть, который позволяет мне вычистить весь текст из одной конкретной статьи:

from bs4 import BeautifulSoup

session = requests.Session()
url = "https://www.nytimes.com/2019/10/23/world/middleeast/what-is-going-to-happen-to-us-inside-isis-prison-children-ask-their-fate.html"
req = session.get(url)
soup = BeautifulSoup(req.text, 'html.parser')
paragraphs = soup.find_all('p')

for p in paragraphs:
    print(p.get_text())

Проблема в том, что я должен быть в состоянии очистить всеиз этих статей в категории, и я не уверен, как это сделать. Поскольку я могу просмотреть одну статью, если мне дан URL-адрес, я предположил бы, что мой следующий шаг - найти способ собрать все URL-адреса в этой конкретной категории, а затем запустить приведенный выше код для каждого из них. Как бы я это сделал, особенно учитывая формат страницы? Что мне делать, если единственный способ увидеть больше статей - это вручную нажать кнопку «ПОКАЗАТЬ БОЛЬШЕ» внизу списка? Эти возможности включены в BeautifulSoup?

1 Ответ

0 голосов
/ 05 ноября 2019

Возможно, вы захотите установить ограничение на количество статей, которые вы хотите получить за раз. Я несколько раз нажимал кнопку «Показать больше» для категории терроризма, и она просто продолжается.

Чтобы найти ссылки, необходимо проанализировать структуру html и найти шаблоны. В этом случае каждый предварительный просмотр статьи находится в элементе списка с class = "css-13mho3u". Однако я проверил другую категорию, и этот шаблон класса не будет соответствовать другим. Но вы можете видеть, что все эти элементы списка находятся под упорядоченным элементом списка, который class = "polite", и это соответствует другим категориям новостей.

Под каждой категорией списка есть одна ссылка, которая будет ссылаться на статью. Так что вам просто нужно взять его и извлечь href. Ваш код может выглядеть примерно так:

ol = soup.find('ol', {'class':'polite'})
lists = ol.findAll('li')
for list in lists:
    link = list.find('a')
    url = link['href']

Чтобы нажать кнопку «Показать больше», вам потребуется использовать дополнительные инструменты за пределами красивого супа. Вы можете использовать веб-драйвер Selenium, чтобы щелкнуть по нему, чтобы открыть следующую страницу. Вы можете следить за верхним ответом на этом ТАК вопросе , чтобы научиться делать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...