2014-12-16 2 views
1

Я ищу, чтобы очистить следующий HTML структуру:Использование текста вложенного элемента в качестве селектора в BeautifulSoup

<p><strong>ID:</strong>547</p> 
<p><strong>Class:</strong>foobar</p> 
<p><strong>Procedures:</strong>lorem ipsum.</p> 
<p>dolor sit amet.</p> 
... 
<p><strong>Description:</strong>curabitur at orci posuere.</p> 
<p>massa nec fringilla.</p> 
... 

Я не слишком уверен в работе с BeautifulSoup, и я не слишком уверен, как обрабатывать факт, что идентификатор для данного раздела (id, класс, процедуры и описание) вложен в первый абзац, содержащий контент для этого раздела.

Я пытаюсь получить где-то вдоль линий следующее:

{ 
    'id': 547, 
    'class': 'foobar', 
    'procedures': 'lorem ipsum. dolor sit amet.' 
    'description': 'curabitur at orci posuere. massa nec fringilla.' 
} 
+0

это словарь, поэтому вы используете обычный 'str.format()' и вставляете 'dict.values ​​()' в них – Abdelouahab

+0

Я не понимаю, что вы говорите. Я ищу способ разделить структуру HTML выше и бросить ее в словарь. –

+0

ах, извините, я думал, что вы хотите сделать инверсию (из словаря, чтобы построить html) – Abdelouahab

ответ

2

Вы можете использовать element.next_sibling ссылку, чтобы получить текст следующие<strong> в тегах. Для p тегов без strong тегов, которые вы должны добавить к последнему обработанному ключу.

Используя метод Element.find_all(), чтобы выбрать все теги <p>, цикл и обновить словарь:

mapping = {} 
key = None 
for item in soup.find_all('p'): 
    if item.strong: 
     key = item.strong.get_text(strip=True).rstrip(':') 
     value = item.strong.next_sibling.strip() 
    else: 
     value = mapping[key] + ' ' + item.get_text(strip=True) 
    mapping[key] = value 

Демо:

>>> from bs4 import BeautifulSoup 
>>> soup = BeautifulSoup('''\ 
... <p><strong>ID:</strong>547</p> 
... <p><strong>Class:</strong>foobar</p> 
... <p><strong>Procedures:</strong>lorem ipsum.</p> 
... <p>dolor sit amet.</p> 
... ... 
... <p><strong>Description:</strong>curabitur at orci posuere.</p> 
... <p>massa nec fringilla.</p> 
... ''') 
>>> mapping = {} 
>>> key = None 
>>> for item in soup.find_all('p'): 
...  if item.strong: 
...   key = item.strong.get_text(strip=True).rstrip(':') 
...   value = item.strong.next_sibling.strip() 
...  else: 
...   value = mapping[key] + ' ' + item.get_text(strip=True) 
...  mapping[key] = value 
... 
>>> from pprint import pprint 
>>> pprint(mapping) 
{u'Class': u'foobar', 
u'Description': u'curabitur at orci posuere. massa nec fringilla.', 
u'ID': u'547', 
u'Procedures': u'lorem ipsum. dolor sit amet.'} 

Это не преобразует идентификатор в целое число; вы можете использовать комбинацию try: value = int(value), except ValueError: pass для этого, если вы решительно настроитесь на преобразование строк, представляющих целые числа.

+0

вам не хватает части описания и процедуры –

+0

@PadraicCunningham: спасибо, что указали это, исправлено. –

+0

Это славно, спасибо! Похоже, в будущем будет много удовольствия с BeautifulSoup. –

 Смежные вопросы

  • Нет связанных вопросов^_^