Соскребая поисковую работу сайта используя BeautifulSoup - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь почистить все полные описания работы с этого сайта, но я застрял: https://www.seek.co.nz/data-analyst-jobs/full-time?daterange=31&salaryrange=70000-999999&salarytype=annual

Моя логика c это найти сначала все ссылки на вакансии на одной странице, а не на следующие страницы.

Мой код выглядит так:

from bs4 import BeautifulSoup
import requests

soup = BeautifulSoup(response.text, 'html.parser')
link_list = []

for a in soup.find_all('a', attrs={'data-automation': 'jobTitle'}, href=True):
    link_list.append('https://www.seek.co.nz/' + a['href'])
print(link_list)

Код выше выглядит хорошо. Я могу напечатать список ссылок на вакансии и поместить их в список, но следующий код напечатал только 2 абзаца, после чего он выдал ошибку:

for link in link_list:
    response = requests.get(link, 'lxml')
    sp = BeautifulSoup(response.text, 'html.parser')
    table = sp.find_all('div',attrs={'data-automation': 'jobDescription'})
    for x in table:
        print(x.find('p').text)


AttributeError                            Traceback (most recent call last)
<ipython-input-41-8afe949a9497> in <module>()
      4     table = sp.find_all('div',attrs={'data-automation': 'jobDescription'})
      5     for x in table:
----> 6         print(x.find('p').text)

AttributeError: 'NoneType' object has no attribute 'text'

Может кто-нибудь сказать мне, почему это не сработало и как сделать это правильно? Я использую Python 3 и BS4. Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

вы должны использовать find_all

for link in link_list:
    response = requests.get(link, 'lxml')
    sp = BeautifulSoup(response.text, 'html.parser')
    table = sp.find_all('div',attrs={'data-automation': 'jobDescription'})
    for x in table:
        all_p = x.find_all('p')
        for para in all_p:
            if para:
                print(para.text)
0 голосов
/ 14 февраля 2020

Проходя по веб-странице , становится ясно, что первые две публикации, которые вы получите через soup.find_all('a', attrs={'data-automation': 'jobTitle'}, href=True), - это рекламные или продвигаемые записи, и, следовательно, веб-страницы эти two и другие объявления о работе приводят к разным. Для последнего, возможно, soup.find('div', attrs={'class':'templatetext'}) сделает работу.

Надеюсь, это поможет!

...