如何用BeautifulSoup4选取两个td元素并同行输出?
问题:配对抓取下的两个内容并同行输出
HTML示例
<tr> <td class ='verseNumCell'> ፳ </td> <td class ='verseConentCell'> ወትቤሎን ኢትስምያኒ ኖሔሚን ስምያኒ መራር እስመ መረርኩ ፈድፋደ ወብዙኀ ። </td> </tr> <tr> <td class ='verseNumCell'> ፳፩ </td> <td class ='verseConentCell'> አንሰ ምልእትየ ሖርኩ ወዕራቅየ አግብአኒ <span class='divineWord'>እግዚአብሔር</span> ለምንት ትብላኒ ኖሔሚን እንዘ <span class='divineWord'>እግዚአብሔር</span> አኅሰረኒ ወፈድፋደ አሕመመኒ ። </td> </tr>
当前实现代码
import bs4 import requests import re url = "https://www.ethiopicbible.com/books/%E1%8A%A6%E1%88%AA%E1%89%B5-%E1%8B%98%E1%8D%8D%E1%8C%A5%E1%88%A8%E1%89%B5-1" parameters = {} response = requests.get(url, params=parameters) soup = bs4.BeautifulSoup(response.text, "html.parser") element_list = soup.find("div", class_="geezBibleChapterContainer").find_all("td") for element in element_list: text = element.get_text() text = os.linesep.join([s for s in text.splitlines() if s]) if not re.match(r'^\s*$', text): print(text)
当前输出
፳ ወትቤሎን ኢትስምያኒ ኖሔሚን ስምያኒ መራር እስመ መረርኩ ፈድፋደ ወብዙኀ ። ፳፩ አንሰ ምልእትየ ሖርኩ ወዕራቅየ አግብአኒ እግዚአብሔር ለምንት ትብላኒ ኖሔሚን እንዘ
期望输出
፳ ወትቤሎን ኢትስምያኒ ኖሔሚን ስምያኒ መራር እስመ መረርኩ ፈድፋደ ወብዙኀ ። ፳፩ አንሰ ምልእትየ ሖርኩ ወዕራቅየ አግብአኒ እግዚአብሔር ለምንት ትብላኒ ኖሔሚን እንዘ
解决方案
不需要分别在不同的soup中选取元素,核心思路是先定位所有<tr>行,再在每行内抓取对应的两个<td>内容,确保配对后同行输出。修改后的代码如下:
import bs4 import requests import os # 补充原代码缺失的导入 url = "https://www.ethiopicbible.com/books/%E1%8A%A6%E1%88%AA%E1%89%B5-%E1%8B%98%E1%8D%8D%E1%8C%A5%E1%88%A8%E1%89%B5-1" response = requests.get(url) soup = bs4.BeautifulSoup(response.text, "html.parser") # 获取章节容器内的所有行 row_list = soup.find("div", class_="geezBibleChapterContainer").find_all("tr") for row in row_list: # 在当前行内分别获取 verseNumCell 和 verseConentCell verse_num_td = row.find("td", class_="verseNumCell") verse_content_td = row.find("td", class_="verseConentCell") # 确保两个元素都存在再处理 if verse_num_td and verse_content_td: # 去除内容中的换行、多余空格 verse_num = ' '.join(verse_num_td.get_text().split()) verse_content = ' '.join(verse_content_td.get_text().split()) # 同行输出配对内容 print(f"{verse_num} {verse_content}")
关键优化点
- 以
<tr>为遍历单位,天然保证两个<td>属于同一行,避免错位 - 使用
' '.join(text.split())简化文本清理,一次性去除所有冗余换行和空格 - 增加元素存在性判断,避免空值引发异常
内容的提问来源于stack exchange,提问作者bsteo
相关产品推荐
相关产品推荐

