0

如果我使用以下命令找到某个标签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 添加或其他解析器。

4

1 回答 1

2

使用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标签之间就没有了,第一种方法会失败,但第二种方法仍然有效。

于 2019-12-01T18:27:53.343 回答