Класс каждой одной и той же страницы на одном и том же веб-сайте меняется. Я пытаюсь соскрести описание со страницы

#python #html #class #web-scraping #beautifulsoup

Вопрос:

 import requests
from bs4 import BeautifulSoup
import numpy as np
import re
import json


title = []
pages = np.arange(1,13)

for page in pages:
    url = 'https://www.jobs.ch/en/vacancies/?page=' str(page) 'amp;term=python web'
    print(url)
    r = requests.get(url)
    soup = BeautifulSoup(r.content, 'html.parser')
    jobs = soup.find_all('a',  class_='sc-hGPAah Link-sc-1vy3ms6-1 jegSWD', href=True, title=True)
    for job in jobs:
        job_title = job['title']
        print(job_title)
        title.append(job_title)
        job_half_url = job['href']
        job_full_url = 'https://www.jobs.ch' str(job_half_url)
        print(job_full_url)
        data = re.search(r"__INIT__ = ({.*})", requests.get(job_full_url).text).group(1)
        data = json.loads(data)
        # print(json.dumps(data, indent=4))
        for j in data["lists"]["jobs"].values():
            soup2 = BeautifulSoup(j["template"], "html.parser")
            # print(soup2)
            for t in soup2.find_all(class_="col-xs-12 col-md-9 col-md-push-3"):
                desc.append(t.get_text(strip=True, separator="n"))
                print(t.get_text(strip=True, separator="n"))
 

Я пытаюсь очистить описание страницы. но каждая страница меняет имя класса div.
в строке для t в soup2.найдите все(class_ = «здесь меняется имя»):

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

1. Да, это обычная мера по борьбе с соскабливанием. Вам нужно будет полагаться на что-то другое, кроме имен классов, или посмотреть, есть ли на веб-сайте API.

Ответ №1:

Используйте атрибуты/типы стабильного вида и их взаимосвязь, например

 print(soup2.select_one('.content-row > div:nth-child(1)').get_text(strip=True, separator="n"))
 

Здесь я полагаюсь на отношение дочернего div к более стабильному родительскому классу.