如何使用 beautifulsoup 在 span 标签之间进行抓取

How to scrape between span tags using beautifulsoup

我正在尝试使用 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>

太棒了。但问题是我想分别提取TEXT1TEXT2TEXT3

我不知道该怎么做。如果我这样做:

soup.find_all("span")[0].find_all("span"),我只得到

<span style="color:
#111111; margin-left: 0.2em">TEXT2 </span>

我认为这是因为这个特定的包含 <span></span>。如何选择 TEXT1TEXT2TEXT3

这是使用文本 属性.

完成工作的片段
In [3]: soup = BeautifulSoup('<span style="margin-right: 0.9em">TEXT1 <span style="color:#111111; margin-left: 0.2em">TEXT2 </span>TEXT3 </span>')
   ...:

In [4]: soup
Out[4]: <html><body><span style="margin-right: 0.9em">TEXT1 <span style="color:#111111; margin-left: 0.2em">TEXT2 </span>TEXT3 </span></body></html>

In [5]: soup.text
Out[5]: u'TEXT1 TEXT2 TEXT3 '

您也可以剥离和拆分输出。

In [7]: soup.text.strip().split()
Out[7]: [u'TEXT1', u'TEXT2', u'TEXT3']

稍微格式化一下,我们就可以看出你的结构是什么样的:

<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 元素,收集他们起来 return 他们。

考虑:

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 ']

请注意,returned 列表的元素不是 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