Как извлечь элемент с веб-страницы со специальным именем класса?

#python #web-scraping #beautifulsoup

#python #веб-очистка #beautifulsoup

Вопрос:

У меня есть текстовый файл, содержащий несколько URL-адресов, каждый URL-адрес представляет собой статью с текстом и соответствующей им ЦУР (пример одной статьи 1)

Текстовые части статьи находятся в «div.text.-normal.content», а затем в «p», а ЦУР находятся в «div.tax-section.text.-normal.small», а затем в «span»

Для их извлечения я использую следующие строки кода :

 data = []

with open('urls_news.txt', 'r') as inf:
    for row in inf:
        url = row.strip()
        response = requests.get(url, headers={'User-agent': 'Mozilla/5.0'})
            
        if response.ok:
            try:
                soup = BeautifulSoup(response.text,"html.parser")
                text = soup.select_one('div.text-normal').get_text(strip=True)
                topic = soup.select_one('div.tax-section').get_text(strip=True)

                data.append(
                    {
                    'text':text,
                    'topic': topic,
                    }
                )
                
                pd.DataFrame(data).to_excel('text_2.xlsx', index = False, header=True)

            except AttributeError:
                print (" ")

    time.sleep(3)
 

Но у меня нет результата, я ранее использовал этот код для извлечения информации того же типа с другого веб-сайта с более четким именем класса. Я также пытался ввести «div.text.-normal.content» и «div.tax-section.text.-normal.small», но результат тот же.

Я думаю, что классы, которые я вызываю в этом примере, неверны. Я хотел бы знать, что я пропустил в названиях классов тезисов.

Ответ №1:

Чтобы выбрать текст, который вы можете использовать:

 soup.select_one('div.text.-normal.content').get_text(strip=True)
 

Думаю, что с именами классов что-то не так, просто соедините их с a . для каждого пробела между ними.

или:

 soup.select_one('div.c-single-content').get_text(strip=True)
 

Чтобы получить темы, как упоминалось, вы можете использовать:

 '^^'.join([topic.get_text(strip=True) for topic in soup.select_one('div.tax-section.text.-normal.small').select('a')])
 

Комментарии:

1. Цель состоит в том, чтобы в конце получить файл формата xlsx с текстом столбца и темами (каждая строка представляет одну статью) для страницы, которую я привел в примере, который я хотел бы, чтобы текст столбца получал текст, начинающийся с «ЦУР обеспечивают основу для решения нескольких приоритетов ….»к «внешним эффектам, возникающим в результате развития инфраструктуры. » и в столбце темы «9. промышленность, инновации …» и «17. партнерство …»

2. Я использовал ваше предложение первой строки для текста, и все в порядке, затем я попробовал soup.select_one(‘div.tax-section.text.-normal.small’).get_text(strip= True) для тем, и все в порядке. Спасибо за вашу помощь