2014-12-28 2 views
0

Рассмотрим следующую ситуацию:BeautifulSoup порядок появления Метки

tag1 = soup.find(**data_attrs) 
tag2 = soup.find(**delim_attrs) 

Есть ли способ узнать, какой тег произошел «первый» на странице?

Разъяснения:

  • Для моих целей, порядок такой же, как и метода FindNext BeautifulSoup в. (В настоящее время я использую этот факт для «решения» моей проблемы, хотя это взломанный.)
  • Цель здесь в основном в том, чтобы накапливать теги, которые не разделены «тегом разделителя». Может быть, есть лучший способ сделать это?

ответ

2

Теги BeautifulSoup не отслеживают их порядок на странице, нет. Вам нужно будет снова перебрать все теги и найти два своих тега в этом списке.

Использование стандартного sample BeautifulSoup tree:

>>> tag1 = soup.find(id='link1') 
>>> tag2 = soup.find(id='link2') 
>>> tag1, tag2 
(<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>) 
>>> all_tags = soup.find_all(True) 
>>> all_tags.index(tag1) 
6 
>>> all_tags.index(tag2) 
7 

Я хотел бы использовать tag.find_all() с функцией, чтобы соответствовать оба типа тегов вместо; таким образом, вы получите список тегов, и может видеть их относительный порядок:

tag_match = lambda el: (
    getattr(el, 'name', None) in ('tagname1', 'tagname2') and 
    el.attrs.get('attributename') == 'something' and 
    'classname' in el.attrs.get('class') 
) 
tags = soup.find(tag_match) 

или вы можете использовать .next_siblings итератор для перебора всех элементов в одной и той же материнской компании и посмотреть, если разделителем идет дальше, и т.д.

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