如何提取<tr>下首个<td>中<a>标签及裸文本,排除其他标签文本
提取HTML表格指定文本的修正方案
需求说明
需要提取HTML表格中每个<tr>元素的第一个<td>内的两类文本:
<a>标签中的文本- 未被任何其他标签包裹的裸文本(示例中标记为"yyy"/"y"的内容为需要提取的,"zzz"为无需提取的)
示例HTML结构
<table> <tbody> <tr> <td> <b>zzz</b> <a href="#">yyy</a> "y" <a href="#">yyy</a> <sup>zzz</sup> <a href="#">yyy</a> <a href="#">yyy</a> "y" </td> <td> zzzzz </td> </tr> </tbody> </table>
现有Python代码
words = [] for tableRows in soup.select("table > tbody > tr"): tableData = tableRows.find("td").text text = [word.strip() for word in tableData.split(' ')] words.append(text) print(words)
问题
当前代码会提取<td>内的所有文本(包括示例中的"zzz"),不符合需求。
修正方案
直接定位目标元素和文本节点,精准筛选需要的内容:
from bs4 import BeautifulSoup, NavigableString # 示例HTML(实际使用时可替换为你的HTML内容) html = """ <table> <tbody> <tr> <td> <b>zzz</b> <a href="#">yyy</a> "y" <a href="#">yyy</a> <sup>zzz</sup> <a href="#">yyy</a> <a href="#">yyy</a> "y" </td> <td> zzzzz </td> </tr> </tbody> </table> """ soup = BeautifulSoup(html, 'html.parser') words = [] for tr in soup.select("table > tbody > tr"): first_td = tr.find("td") current_content = [] # 提取所有<a>标签的文本 for a in first_td.find_all("a"): a_text = a.get_text(strip=True) if a_text: current_content.append(a_text) # 提取<td>下的裸文本节点 for child in first_td.children: if isinstance(child, NavigableString): raw_text = child.strip() if raw_text: current_content.append(raw_text) words.append(current_content) print(words)
说明
- 先通过
find_all("a")获取<td>内所有<a>标签的文本,清理空白后加入结果 - 遍历
<td>的直接子节点,筛选出NavigableString类型的节点(即裸文本),清理空白后加入结果 - 最终结果仅包含需求中的"yyy"和"y"类内容,排除了其他标签包裹的"zzz"
内容的提问来源于stack exchange,提问作者Vahe
相关产品推荐
相关产品推荐

