Python beautifulsoup - 获取所有由 break 标记分隔的文本

Python beautifulsoup - get all text separated by break tag

我有以下表格:

<table width="100%" border="0" cellspacing="2" cellpadding="0">
                      <tbody><tr> 
                        <td class="labelplain">ANGARA, EDGARDO J.<br>ENRILE, JUAN PONCE<br>MAGSAYSAY JR., RAMON B.<br>ROXAS, MAR<br>GORDON, RICHARD "DICK" J.<br>FLAVIER, JUAN M.<br>MADRIGAL, M. A.<br>ARROYO, JOKER P.<br>RECTO, RALPH G.<br></td>
                      </tr>
                    </tbody></table>

我可以使用下面的代码遍历 HTML 的这一部分:

soup.find('td', text = re.compile('Co-author\(s'), attrs={'class': 'labelplain'}).find_next('td')
coauthor = soup.find('td', text = re.compile('Co-author\(s'), attrs={'class': 'labelplain'}).find_next('td')

我可以使用下面的方法获取文本:

for br in coauthor.find_all('br'):
  firstcoauthor = (br.previousSibling)
  print (firstcoauthor)

我想要到达的输出是所有文本的结果,然后用分号 (;) 分隔,如下所示: ANGARA, EDGARDO J.;ENRILE, JUAN PONCE;MAGSAYSAY JR., RAMON B.;ROXAS, MAR;GORDON, RICHARD "DICK" J.;FLAVIER, JUAN M.;MADRIGAL, M. A.;ARROYO, JOKER P.;RECTO,拉尔夫·G.

但是上面的代码给出了如下结果:

ANGARA, EDGARDO J.
ENRILE, JUAN PONCE
MAGSAYSAY JR., RAMON B.
ROXAS, MAR
GORDON, RICHARD "DICK" J.
FLAVIER, JUAN M.
MADRIGAL, M. A.
ARROYO, JOKER P.
RECTO, RALPH G.

我尝试了替换功能,但没有用。

print (firstcoauthor.replace("\n", ";"))

print (firstcoauthor.replace("\r\n", ";"))

甚至转义 \r\n 和 \n 像这样:

print (firstcoauthor.replace("\n", ";"))

如何处理我的用例?

Select 你想要的元素 - 我只是在这里选择 td ......(但是使用任何你有嵌入 br 元素的元素)

data = soup.select_one('td')

然后...将所有 br 元素替换为 semi-colon:

for br in data.select('br'):
    br.replace_with(';')

获取元素的文本:

output = data.get_text()
# 'ANGARA, EDGARDO J.;ENRILE, JUAN PONCE;MAGSAYSAY JR., RAMON B.;ROXAS, MAR;GORDON, RICHARD "DICK" J.;FLAVIER, JUAN M.;MADRIGAL, M. A.;ARROYO, JOKER P.;RECTO, RALPH G.;'

认为通过将 join/delimiter 参数设置为 get_text():

可以更简单地获得该结果
soup.find('td').get_text(';')

根据你的例子你会得到:

ANGARA, EDGARDO J.;ENRILE, JUAN PONCE;MAGSAYSAY JR., RAMON B.;ROXAS, MAR;GORDON, RICHARD "DICK" J.;FLAVIER, JUAN M.;MADRIGAL, M. A.;ARROYO, JOKER P.;RECTO, RALPH G.

编辑

根据您评论中提到的行为,额外的分号,我怀疑元素的结构与问题中的不同,并且有额外的中断。

既然如此,我会改变策略并推荐:

  • 将额外的 strip 参数添加到 get_text():

    soup.find('td').get_text(';', strip=True)
    
  • 或者使用stripped_strings中的join(),几乎是一样的:

    ';'.join(soup.find('td').stripped_strings)
    
示例HTML

向 HTML 添加了额外的 <br>、空格和换行符。

html = '''
<table width="100%" border="0" cellspacing="2" cellpadding="0">
    <tbody><tr>
    
    <br>
           <td class="labelplain">
           ANGARA, EDGARDO J.<br>ENRILE, JUAN PONCE<br>MAGSAYSAY JR., RAMON B.<br>ROXAS, MAR<br>GORDON, RICHARD "DICK" J.<br>FLAVIER, JUAN M.<br>MADRIGAL, M. A.<br>ARROYO, JOKER P.<br>RECTO, RALPH G.<br> 
           
           <br>
           </td>
           </tr>
</tbody></table>'''
输出
ANGARA, EDGARDO J.;ENRILE, JUAN PONCE;MAGSAYSAY JR., RAMON B.;ROXAS, MAR;GORDON, RICHARD "DICK" J.;FLAVIER, JUAN M.;MADRIGAL, M. A.;ARROYO, JOKER P.;RECTO, RALPH G.