BeautifulSoup - работа с таблицами, как структуры сайта | возвращение словаря - PullRequest
3 голосов
/ 09 ноября 2019

У меня есть какой-то html, который выглядит как словарь:

Веб-сайт производителя: веб-сайт,

Штаб-квартира: местонахождение и т. Д.

Каждая часть содержится всвой собственный div (так что findAll, имя класса div).

Существует ли элегантный и простой способ извлечь такой код в словарь? Или нужно перебрать каждый элемент div, найти оба текстовых элемента и предположить, что первый текстовый элемент является ключом словаря, а второе значение является значением того же элемента dict.

Пример кода сайта:

    car = '''
     <div class="info flexbox">
       <div class="infoEntity">
        <span class="manufacturer website">
         <a class="link" href="http://www.ford.com" rel="nofollow noreferrer" target="_blank">
          www.ford.com
         </a>
        </span>
       </div>
       <div class="infoEntity">
        <label>
         Headquarters
        </label>
        <span class="value">
         Dearbord, MI
        </span>
       </div>
       <div class="infoEntity">
        <label>
         Model
        </label>
        <span class="value">
         Mustang
        </span>
       </div>
    '''

car_soup = BeautifulSoup(car, 'lxml')
print(car_soup.prettify())

elements = car_soup.findAll('div', class_ = 'infoEntity')
for x in elements:
    print(x)  ###and then we start iterating over x, with beautiful soup, to find value of each element.

Требуемый вывод - это

expected result result = {'manufacturer website':"ford.com", 'Headquarters': 'Dearborn, Mi', 'Model':'Mustang'}

PS Я уже несколько раз делал не элегантный способ, просто удивляюсь, что я что-то упустил, и есть лилучший способ сделать это. Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 09 ноября 2019

Кроме того, чтобы сделать вещи более или менее общими и простыми, вы можете разделить обработку полей с метками и ссылкой на веб-сайт производителя:

soup = BeautifulSoup(car, 'lxml')

car_info = soup.select_one('.info')
data = {
    label.get_text(strip=True): label.find_next_sibling().get_text(strip=True)
    for label in car_info.select('.infoEntity label')
}
data['manufacturer website'] = car_info.select_one('.infoEntity a').get_text(strip=True)

print(data)

Отпечатки:

{'Headquarters': 'Dearbord, MI', 
 'Model': 'Mustang', 
 'manufacturer website': 'www.ford.com'}
2 голосов
/ 09 ноября 2019

Текущая структура HTML довольно общая, она содержит несколько infoEntity элементов div с дочерним содержимым, которые могут быть отформатированы несколькими способами. Чтобы справиться с этим, вы можете перебрать infoEntity делений и применить форматирование объекта следующим образом:

from bs4 import BeautifulSoup as soup
result, label = {}, None
for i in soup(car, 'html.parser').find_all('div', {'class':'infoEntity'}):
   for b in i.find_all(['span', 'label']):
      if b.name == 'label':
         label = b.get_text(strip=True)
      elif b.name == 'span' and label is not None:
         result[label] = b.get_text(strip=True)
         label = None
      else:
         result[' '.join(b['class'])] = b.get_text(strip=True)

Вывод:

{'manufacturer website': 'www.ford.com', 'Headquarters': 'Dearbord, MI', 'Model': 'Mustang'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...