我正在尝试使用python + beautifulsoup抓取文本。我输入如下代码:
soup.find_all("span")[0]
这让我:
<span style="margin-right: 0.9em">TEXT1 <span style="color:
#111111; margin-left: 0.2em">TEXT2 </span>TEXT3 </span>
这很棒。但问题是,我想提取TEXT1
,TEXT2
和TEXT3
分别。
我不知道该怎么做。如果我做:
soup.find_all(“ span”)[0] .find_all(“ span”),我只会
<span style="color:
#111111; margin-left: 0.2em">TEXT2 </span>
我认为这是因为这个特定的元素同时包含<span>
和</span>
。如何挑选TEXT1
,TEXT2
和TEXT3
?
稍微格式化一下,我们就能看到您拥有什么样的结构:
<span style="margin-right: 0.9em">
TEXT1
<span style="color:#111111; margin-left: 0.2em">
TEXT2
</span>
TEXT3
</span>
所以,很遗憾,我们不能用一种方法像这样的,因为我们要访问的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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句