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.
我有以下表格:
<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.