稍微格式化一下,我们就可以看出你有什么样的结构:
<span style="margin-right: 0.9em">
TEXT1
<span style="color:#111111; margin-left: 0.2em">
TEXT2
</span>
TEXT3
</span>
因此,很遗憾,我们不能使用like this one 方法,因为我们想在多个深度访问NavigableText 元素。
一种方法是创建一个函数,递归检查某个给定元素的子元素(在下面的函数中称为context),如果它们是NavigableText 元素,则将它们收集起来并返回。
考虑:
from bs4.element import NavigableString, Tag
def extractNavigableStrings(context):
strings = []
for e in context.children:
if isinstance(e, NavigableString):
strings.append(e)
if isinstance(e, Tag):
strings.extend(extractNavigableStrings(e))
return strings
我们可以根据您的输入运行:
from bs4 import BeautifulSoup
from bs4.element import NavigableString, Tag
def extractNavigableStrings(context):
strings = []
for e in context.children:
if isinstance(e, NavigableString):
strings.append(e)
if isinstance(e, Tag):
strings.extend(extractNavigableStrings(e))
return strings
soup = BeautifulSoup('''<span style="margin-right: 0.9em">TEXT1 <span style="color: #111111; margin-left: 0.2em">TEXT2 </span>TEXT3 </span>''')
print(extractNavigableStrings(soup))
print 函数显示我们的NavigableStrings 列表
[u'TEXT1', u'TEXT2', u'TEXT3']
请注意,返回列表的元素不是 python 字符串,它们是NavigableString 元素——打印它们很好,但如果你想获取字符串内容,你会想要unicode(<element>)。例如:
nss = extractNavigableStrings(soup)
strings = [unicode(ns.string) for ns in nss]
print strings # [u'TEXT1 ', u'TEXT2 ', u'TEXT3 ']
for s in strings: print type(s), s
# <type 'unicode'> TEXT1
# <type 'unicode'> TEXT2
# <type 'unicode'> TEXT3