如何使用beautifulsoup刮取span标签

时间:2015-03-17 22:20:06

标签: python web-scraping 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

2 个答案:

答案 0 :(得分:3)

这是一个使用text属性完成工作的片段。

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

答案 1 :(得分:2)

通过一些格式化,我们可以看到你有什么样的结构:

<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