Как проверить, является ли тег BeautifulSoup определенным тегом? - PullRequest
0 голосов
/ 01 декабря 2019

Если я нахожу определенный тег, используя beautifulsoup:

styling = paragraphs.find_all('w:rpr')

, я смотрю на следующий тег. Я хочу использовать этот тег, только если это тег <w:t>. Как проверить тип тега следующего тега?

Я пытался element.find_next_sibling().startswith('<w:t') для элемента, но он говорит NoneType object is not callable. Я также попытался element.find_next_sibling().find_all('<w:t'>), но ничего не возвращается.

for element in styling:
    next = element.find_next_sibling()
    if(#next is a <w:t> tag):
        ...

Я использую beautifulsoup и хотел бы придерживаться его и не добавлять eTree или другой парсер, если это возможно, с помощью bs4.

1 Ответ

2 голосов
/ 01 декабря 2019

Используя item.name, вы можете увидеть имя тега.

Проблема в том, что между тегами есть элементы NavigableString, которые также рассматриваются как элементы одного уровня, и они дают None.

Вам придется пропустить эти элементы, или вы можете получить всех братьев и сестер и использовать цикл for, чтобы найти первый <w:t> и выйти из цикла с break

from bs4 import BeautifulSoup as BS

text = '''<div>
  <w:rpr></w:rpr>
  <w:t>A</w:t>
</div>'''

soup = BS(text, 'html.parser')

all_wrpr = soup.find_all('w:rpr')
for wrpr in all_wrpr:

    next_tag = wrpr.next_sibling
    print('name:', next_tag.name) # None

    next_tag = wrpr.next_sibling.next_sibling
    #next_tag = next_tag.next_sibling
    print('name:', next_tag.name) # w:t
    print('text:', next_tag.text) # A

#name: None
#name: w:t
#text: A

print('---')

all_siblings = wrpr.next_siblings
for item in all_siblings:
    if item.name == 'w:t':
       print('name:', item.name) # w:t
       print('text:', item.text) # A
       break # exit after first <w:t>

#name: w:t
#text: A    

РЕДАКТИРОВАТЬ: Если вы тестируете код с форматированием HTML немного отличается

text = '''<div>
  <w:rpr></w:rpr><w:t>A</w:t>
</div>'''

, то между тегами не будет NavigableString, и первый метод завершится неудачно, но второй метод все равно будет работать.

...