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

Posted

技术标签:

【中文标题】如何在python中忽略BeautifulSoup解析器中的换行符【英文标题】:How to ignore the line breaks in BeautifulSoup parser in python 【发布时间】:2020-09-11 22:18:04 【问题描述】:

好的,我开始回答我的第一个问题。 我正在尝试使用 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 French”,以便我可以将两个字。

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

"                               BulldogFrench      "

感谢您的帮助!

【问题讨论】:

首先 split() 并获取第一个元素,然后 strip() 它。 【参考方案1】:

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

【讨论】:

以上是关于如何在python中忽略BeautifulSoup解析器中的换行符的主要内容,如果未能解决你的问题,请参考以下文章

Beautifulsoup + HTML...如何忽略一些 h3 类

为什么BeautifulSoup库只忽略一个特定的元素?

python BeautifulSoup4 获取 script 节点问题

BeautifulSoup 不会使用 .find_all('a') 抓取页面中的所有锚标记。我忽略了啥吗?

如何在 Python 中使用 Beautifulsoup 从 Indeed 搜索中获取所有招聘信息的 href?

如何伪造在 Python 请求/beautifulsoup 中启用的 javascript