Очистка веб — страниц BeautifulSoup-Не удается получить доступ и извлечь элемент

#python #web-scraping #beautifulsoup

Вопрос:

это мой первый вопрос в stack overflow. Я работаю над проектом по очистке веб-страниц и пытаюсь получить доступ к html-элементам с помощью красивого супа.

Пожалуйста, кто-нибудь может дать мне совет, как извлечь следующие элементы?

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

Элементы списка заданий находятся внутри «Содержимого раздела результатов».

Я хочу получить доступ к каждому «классу статей» и

  1. извлеките его идентификатор, например, должность-7460756
  2. извлеките его ссылку, где data-at=»должность-должность-название».
  3. извлеките его текст h2 (решено)

Как выполнить циклический просмотр ResultsSectionContainer и получить доступ/извлечь информацию для каждого элемента / идентификатора задания «класс статьи»?

Имя класса статьи каким-то образом динамично/уникально и меняется (я думаю) каждый раз, когда выполняется новый поиск.

 <div class="ResultsSectionContainer-gdhf14-0 cxyAav">n 
 <article class="sc-fzowVh cUgVEH" id="job-item-7460756">
  <a class="sc-fzoiQi eRNcm" data-at="job-item-title" 
    href="/stellenangebote--Wirtschaftsinformatiker-m-w-d-mit-Schwerpunkt-ERP-Systeme-Heidelberg-Celonic-Deutschland-GmbH-Co-KG--7460756-inline.html" target="_blank">n
    <h2 class="sc-fzqARJ iyolKq">n  Wirtschaftsinformatiker (m/w/d) mit Schwerpunkt ERP-Systemen                
        </h2>n               
        </a>n              
  
  <article class="sc-fzowVh cUgVEH" id="job-item-7465958">n
   ...

 

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

1. Пожалуйста, разместите URL-адрес

Ответ №1:

Ты можешь сделать вот так.

  • Выберите <div> с именем класса как ResultsSectionContainer-gdhf14-0
  • Найдите все <article> теги внутри приведенного выше <div> с помощью .find_all() это даст вам список всех тегов статей
  • Повторите приведенный выше список и извлеките необходимые вам данные.
 from bs4 import BeautifulSoup

s = '''<div class="ResultsSectionContainer-gdhf14-0 cxyAav">
 <article class="sc-fzowVh cUgVEH" id="job-item-7460756">
  <a class="sc-fzoiQi eRNcm" data-at="job-item-title" 
    href="/stellenangebote--Wirtschaftsinformatiker-m-w-d-mit-Schwerpunkt-ERP-Systeme-Heidelberg-Celonic-Deutschland-GmbH-Co-KG--7460756-inline.html" target="_blank">
    <h2 class="sc-fzqARJ iyolKq">  Wirtschaftsinformatiker (m/w/d) mit Schwerpunkt ERP-Systeme
        </h2>
        </a>
  
  </div>'''

soup = BeautifulSoup(s, 'lxml')
d = soup.find('div', class_='ResultsSectionContainer-gdhf14-0')
for i in d.find_all('article'):
    job_id = i['id']
    job_link = i.find('a', {'data-at': 'job-item-title'})['href']
    print(f'JOB_ID: {job_id}nJOB_LINK: {job_link}')
 
 JOB_ID: job-item-7460756
JOB_LINK: /stellenangebote--Wirtschaftsinformatiker-m-w-d-mit-Schwerpunkt-ERP-Systeme-Heidelberg-Celonic-Deutschland-GmbH-Co-KG--7460756-inline.html
 

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

1. Большое вам спасибо за ваш быстрый ответ. Это решение очень помогает.

Ответ №2:

Если все классы статей одинаковы, попробуйте это

 articles = data.find_all("article", attrs={"class": "sc-fzowVh cUgVEH"})

for article in articles:
    print(article.get("id"))
    print(article.a.get("href"))
    print(article.h2.text.strip())
 

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

1. Спасибо вам за быстрый ответ. Название класса «sc-fzowVh cUgVEH» может быть изменено. Похоже, что это может не сработать, если я захочу применить этот код в будущих результатах поиска.

Ответ №3:

Вы могли бы сделать что-то вроде этого:

 results = soup.findAll('article', {'class': 'sc-fzowVh cUgVEH'})

for result in results:
    id = result.attrs['id']
    href = result.find('a').attrs['href']
    h2 = result.text.strip()
    
    print(f' Job id: t{id}n Job link: t{href}n Job desc: t{h2}n')
    print('---')
 

вы также можете указать префикс href URL — адреса, с которого вы извлекаете результаты.