как исправить ошибку атрибута

#python #web-scraping #beautifulsoup

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

Вопрос:

Я создаю веб-оболочку с помощью python.

но я не могу исправить ошибку AttributeError: объект ‘NoneType’ не имеет атрибута ‘find’

это мой код

 def extract_indeed_jobs(last_page):
    jobs = []
    # for page in range(last_page):
    result = requests.get(f"{URL}amp;start={0*LIMIT}")
    soup = BeautifulSoup(result.text, "html.parser")
    results = soup.find_all("div", {"class": "jobsearch-SerpJobCard"})
    # print(results)       It works!!

    for result in results:
        # print(results)      It works!!
        title = result.find("h2", {"class:": "title"})
        # i think above line is the problem but i dont konw how to fix it
        # 'results' have <h2> tag, i checked from printed out 'results'
        print(title.find("a"))

    return jobs
 

я думаю, что проблема title = result.find(«h2», {«class:»: «title»})
, но не знаю, как это исправить

этот код мне не помог

 title = result.find("a", {"class":"jobtitle"})["title"]
 

Я ценю любой намек 🙂

весь код:

 import requests
from bs4 import BeautifulSoup

LIMIT = 50

URL = f"https://kr.indeed.com/취업?q=pythonamp;limit={LIMIT}"


def extract_indeed_pages():
    result = requests.get(URL)

    soup = BeautifulSoup(result.text, "html.parser")

    pagination = soup.find("div", {"class": "pagination"})

    links = pagination.find_all('a')
    pages = []

    for link in links[:-1]:
        pages.append(int(link.string))

    max_page = pages[-1]
    return max_page


def extract_indeed_jobs(last_page):
    jobs = []
    # for page in range(last_page):
    result = requests.get(f"{URL}amp;start={0*LIMIT}")
    soup = BeautifulSoup(result.text, "html.parser")
    results = soup.find_all("div", {"class": "jobsearch-SerpJobCard"})

    for result in results:
        if not result:
            results.remove(result)

    for result in results:
        title = result.find("h2", {"class:": "title"})
        print(title.find("a"))

    return jobs
 

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

1. Я не думаю, что ошибка может исходить из этой строки. Это, вероятно title.find("a") . Показать полную обратную трассировку.

2. @BekhruzNiyazov Я не думаю, что есть какой-либо способ find_all() вернуть список, который включает None .

3. @Barmar ну, если вы думаете об этом логически, должно быть. Если пользователь не получает ошибку, for result in results это означает, что result это список. Если results бы [ ] было равно, не было бы никаких ошибок. Но если вы посмотрите на сообщение об ошибке, вы увидите это "NoneType object has no attribute find" , и это означает, что result это равно None , и это означает, что None в results списке есть.

4. @BekhruzNiyazov Есть два вызова find() . Поскольку find_all() гарантированно возвращает список объектов, result не может быть None . В процессе устранения ошибка должна быть в другом вызове, title.find("a") , так title и есть None .

Ответ №1:

Что происходит?

Вы пытаетесь find() использовать заголовок таким образом, но вы никогда не получите совпадение, причина атрибута class: :

 title = result.find("h2", {"class:": "title"})
 

Как это исправить?

Просто удалите опечатку : в вашем определении «class:»:

 title = result.find("h2", {"class": "title"})
 

Пример

 import requests
from bs4 import BeautifulSoup

soup = BeautifulSoup(requests.get(f"https://de.indeed.com/jobs?q=Vollzeitamp;l=Bremenamp;start=40").text, "html.parser")
results = soup.find_all("div", {"class": "jobsearch-SerpJobCard"})

for result in results:
    title = result.find("h2", {"class": "title"})
    print(title.a.text)
 

Вывод

 Mediengestalter (Bildamp;Ton)/ Filmemacher in Teil-/Vollzeit

Freelance (m/w/d)

Immobilienmakler (m/w/x) mit Festgehalt und ungedeckelter Pr...

Fahrer (m/w/d) für Betonmischer in Bremen

Glasreiniger / Gehilfe Vollzeit

Helfer Verpackung (m/w/d)

Ehrenamtliche Helfer (m/w/d)