добавление python () и удаление html-тегов

#python-3.x #beautifulsoup #append

#python-3.x #beautifulsoup #добавить

Вопрос:

Мне нужна помощь. Мой вывод кажется неправильным. Как я могу правильно добавить значения dept, job_title, job_location . И есть html-теги со значениями dept . как я могу удалить эти теги.

мой код

 response = requests.get("http://hortonworks.com/careers/open-positions/")
soup = BeautifulSoup(response.text, "html.parser")

jobs = []


div_main = soup.select("div#careers_list")


for div in div_main:
    dept = div.find_all("h4", class_="department_title")
    div_career = div. find_all("div", class_="career")
    title = []
    location = []
    for dv in div_career:
        job_title = dv.find("div", class_="title").get_text().strip()
        title.append(job_title)
        job_location = dv.find("div", class_="location").get_text().strip()
        location.append(job_location)

    job = {
        "job_location": location,
        "job_title": title,
        "job_dept": dept
    }
    jobs.append(job)
pprint(jobs)
  

Это должно выглядеть так

{‘job_dept’: консультация,

‘job_location’:’Чикаго, Иллинойс’

‘job_title’: старший консультант — Центральный ‘

1 значение для каждой переменной.

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

1. пожалуйста, покажите результат, который вы получаете…

2. на выходе будет показано, job_dept: все отделы, job _location: все местоположения, job_title: все названия

Ответ №1:

Структура вашего html является последовательной, а не иерархической, поэтому вам нужно перебирать список заданий и обновлять название отдела по ходу работы:

 import requests
from bs4 import BeautifulSoup, Tag
from pprint import pprint
headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20130331 Firefox/21.0'}
response = requests.get("http://hortonworks.com/careers/open-positions/", headers=headers)

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

jobs = []


div_main = soup.select("div#careers_list")


for div in div_main:
    department_title = ""
    for element in div:
        if isinstance(element, Tag) and "class" in element.attrs:
            if "department_title" in element.attrs["class"]:
                department_title = element.get_text().strip()
            elif "career" in element.attrs["class"]:
                location = element.select("div.location")[0].get_text().strip()
                title = element.select("div.title")[0].get_text().strip()
                job = {
                    "job_location": location,
                    "job_title": title,
                    "job_dept": department_title
                }
                jobs.append(job)

pprint(jobs)
  

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

1. У меня возникает эта ошибка при запуске этого. если isinstance(элемент, тег) и element.attrs.has_key(«класс»): ошибка атрибута: объект ‘dict’ не имеет атрибута ‘has_key’

2. Я обновил свой ответ, чтобы он работал с python3.

3. вау. Удивительно. Это работает хорошо. Вывод правильный.. Я использую pycharm. часть «job_dept»: department_title. был выделен заголовок department_title. В нем говорилось: имя ‘department_title’ может быть не определено

4. Вы должны инициализировать department_title переменную перед ее использованием. В нашем случае это нормально, потому что у нас есть фиксированная последовательность html-тегов, но если бы div department_title перед тегом с атрибутом div class не career было тега с атрибутом class, произошла бы ошибка. Итак, было бы лучше установить переменную department_title в пустую строку перед переходом ко второму for циклу.

5. хорошо, отлично. Можете ли вы подробнее рассказать об этой строке: если isinstance(элемент, тег) и «класс» в element.attrs: я впервые вижу этот isinstance .