BeautifulSoup 具有特殊功能get_text(),它具有选项separator 以将文本从不同的子项中分离出来。默认情况下,它使用空字符串作为分隔符,因此您会得到BulldogFrench,但您可以使用空格作为分隔符。如果您想要保留带有空格的字符串,那么您可以使用一些独特的字符,例如|,以便以后使用split("|")。
from bs4 import BeautifulSoup as BS
text = '''
<td class="searchResultsDogBreed">Bulldog1</td>
<td class="searchResultsDogBreed">Bulldog2<br/>French</td>
'''
soup = BS(text, 'html.parser')
all_items = soup.find_all('td')
for item in all_items:
text = item.get_text(separator='|')
print('before:', text)
text = text.split('|')[0]
print('after:', text)
结果:
before: Bulldog1
after: Bulldog1
---
before: Bulldog2|French
after: Bulldog2
---
顺便说一句:get_text() 还可以选择 strip=True 在将元素连接到一个字符串之前删除空格 - 当元素之间有很多空格时,它会很有用。
您也可以使用.children 创建包含所有子元素的列表并仅获取第一个元素
from bs4 import BeautifulSoup as BS
text = '''
<td class="searchResultsDogBreed">Bulldog1</td>
<td class="searchResultsDogBreed">Bulldog2<br/>French</td>
'''
soup = BS(text, 'html.parser')
all_items = soup.find_all('td')
for item in all_items:
elements = list(item.children)
print(' All:', elements)
print('First:', elements[0])
print('---')
结果:
All: ['Bulldog1']
First: Bulldog1
---
All: ['Bulldog2', <br/>, 'French']
First: Bulldog2
顺便说一句:只获取文本元素
elements = [x for x in item.children if isinstance(x, str)]
结果:
All: ['Bulldog1']
All: ['Bulldog2', 'French']
编辑:你可以试试list(item.children)
elements = item.contents
您也可以尝试item.next,但如果当前td 为空,它可能会得到下一个td(或\n)。
from bs4 import BeautifulSoup as BS
text = '''
<td class="searchResultsDogBreed">Bulldog1</td>
<td class="searchResultsDogBreed"></td>
<td class="searchResultsDogBreed">Bulldog2<br/>French</td>
'''
soup = BS(text, 'html.parser')
all_items = soup.find_all('td')
for item in all_items:
print(' item:', item)
print('children:', list(item.children))
print('contents:', item.contents)
print(' next:', item.next)
print(' 2x next:', item.next.next)
print(' 3x next:', item.next.next.next)
#elements = list(item.children)
elements = item.contents
#elements = [x for x in item.children if isinstance(x, str)]
print(' All:', elements)
if elements:
print(' First:', elements[0])
else:
print(' First:')
print('---')
结果:
item: <td class="searchResultsDogBreed">Bulldog1</td>
children: ['Bulldog1']
contents: ['Bulldog1']
next: Bulldog1
2x next:
3x next: <td class="searchResultsDogBreed"></td>
All: ['Bulldog1']
First: Bulldog1
---
item: <td class="searchResultsDogBreed"></td>
children: []
contents: []
next:
2x next: <td class="searchResultsDogBreed">Bulldog2<br/>French</td>
3x next: Bulldog2
All: []
First:
---
item: <td class="searchResultsDogBreed">Bulldog2<br/>French</td>
children: ['Bulldog2', <br/>, 'French']
contents: ['Bulldog2', <br/>, 'French']
next: Bulldog2
2x next: <br/>
3x next: French
All: ['Bulldog2', <br/>, 'French']
First: Bulldog2
---