使用 bs4 get_text() 删除 `\n`

removing `\n` using bs4 get_text()

from bs4 import BeautifulSoup


# current output as below
"""
'DOMINGUEZ, JONATHAN D. VS. RAMOS,\n
                                           SILVIA M'
"""

# desired one is

#  DOMINGUEZ, JONATHAN D. VS. RAMOS, SILVIA M

x = """<td width="350px" valign="top"
   style="padding:.5rem;">
   DOMINGUEZ, JONATHAN D. VS. RAMOS,
   SILVIA M
</td>"""

soup = BeautifulSoup(x, 'lxml')
print(soup.select_one('td').get_text(strip=True, separator='\n'))

我检查了 docs,我相信 get_text() 可以做到这一点,但我不确定怎么做!

separator='\n'更改为separator=' '

您可能需要一个正则表达式,这也可以去掉多余的空格:

from bs4 import BeautifulSoup
import re

x = """<td width="350px" valign="top"
   style="padding:.5rem;">
   DOMINGUEZ, JONATHAN D. VS. RAMOS,
   SILVIA M
</td>"""

soup = BeautifulSoup(x, 'lxml')
text = re.sub(r'\s+', ' ', soup.select_one('td').get_text(strip=True))
print(text)

给予:

DOMINGUEZ, JONATHAN D. VS. RAMOS, SILVIA M

只是为了提供一些上下文 - 在这种情况下 get_text(strip=True) 本身不会起作用,因为 <td> 中的文本不是由标签“分隔”的,更准确地说不是由 <br> , 因此它将被识别为一个包含换行符的“多行”字符串。

由于这种情况,参数 strip=True 仅从整个字符串中去除左右字符。


基于以下 HTML,它可以按照您的方式使用空格作为分隔符:

x = """<td width="350px" valign="top"
style="padding:.5rem;">
DOMINGUEZ, JONATHAN D. VS. RAMOS,<br> 
SILVIA M

</td>"""

soup = BeautifulSoup(x)
soup.td.get_text(' ',strip=True)

但是如果字符串中没有包含任何标记作为可能的分隔符,我建议使用 @Martin Evans 使用 [=16= 回答] 也能很好地处理多个空格。

re.sub(r'\s+', ' ', soup.select_one('td').get_text(strip=True))