如何在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 类
python BeautifulSoup4 获取 script 节点问题
BeautifulSoup 不会使用 .find_all('a') 抓取页面中的所有锚标记。我忽略了啥吗?