如何使用 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>
太棒了。但问题是我想分别提取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
?
这是使用文本 属性.
完成工作的片段
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
我正在尝试使用 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
?
这是使用文本 属性.
完成工作的片段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