如何在python中忽略BeautifulSoup解析器中的换行符

2024-04-27 00:20:32 发布

您现在位置:Python中文网/ 问答频道 /正文

好的,我来回答我的第一个问题。 我正在尝试解析一个带有BeautifulSoup的网站的一些内容。我想抓取的内容是td标签;但有时是两行,有时不是(包括代码中的换行符)

斗牛犬示例:

有时<td class="searchResultsDogBreed">Bulldog</td>
其他时间<td class="searchResultsDogBreed">Bulldog<br/>French</td>

当我使用以下内容列出狗的品种时:

for db in soup.body.find_all('td', class_="searchResultsDogBreed"):
         list_dogbreed.append(db.text.strip())

它会像预期的那样将一些结果显示为BulldogFrench,因为它会去掉所有空格。我想忽略法语,只使用Bulldog,因为我只关心它是否是Bulldog,或者至少列出它,以便输出为“Bulldog French”,这样我就可以将这两个单词分开

我必须以某种方式剥离空间,因为没有strip()的实际输出类似于

"                               BulldogFrench      "

谢谢你的帮助


Tags: 代码示例内容db网站时间标签class
1条回答
网友
1楼 · 发布于 2024-04-27 00:20:32

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
 -

相关问题 更多 >