#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 .