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