如何使用BeautifulSoup查找包含多个特定文本td的tr元素?
解决方案:查找包含多个指定文本的所在
需求
查找同时包含文本10.13.18.150和StreaNetwork的<td>元素所在的<tr>数据。
示例HTML
<tr id="fr119" onclick="fr_toggle(119)" ondblclick="document.location='firewall_rules_edit.php?id=120';" class="ui-sortable-handle" style=""> <td> <input type="checkbox" id="frc119" onclick="fr_toggle(119)" name="rule[]" value="120"> </td> <td title="traffic is passed"> <a href="?if=lan&act=toggle&id=120" usepost=""> <i class="fa fa-check text-success" title="click to toggle enabled/disabled status"></i> </a> <i class="fa fa-cog" title="advanced setting: gateway PeakJioAirtel " style="cursor: pointer;"></i> </td> <td> 10.13.18.150 </td> <td> StreaNetwork </td> </tr>
原代码问题
你当前使用的代码里,BeautifulSoup原生的find方法不支持CSS选择器的:contains()和:has()语法,直接这么写会失效。
可行方案
方案一:原生遍历(无需额外依赖)
遍历所有<tr>,检查每个<tr>下的<td>文本是否同时包含两个目标值:
from bs4 import BeautifulSoup html_data = """[此处填入你的HTML内容]""" complete_soup = BeautifulSoup(html_data, 'html.parser') target_tr = None # 遍历所有tr元素 for tr in complete_soup.find_all('tr'): # 提取所有td的文本并去除多余空白 td_texts = [td.get_text(strip=True) for td in tr.find_all('td')] # 验证是否同时包含两个目标文本 if '10.13.18.150' in td_texts and 'StreaNetwork' in td_texts: target_tr = tr break # 输出结果 if target_tr: print(target_tr.prettify())
方案二:使用高级CSS选择器(需额外安装库)
如果想用更简洁的CSS选择器写法,需要安装soupsieve库扩展BeautifulSoup的选择器能力:
- 先安装依赖:
pip install soupsieve
- 然后使用
select_one方法匹配:
from bs4 import BeautifulSoup complete_soup = BeautifulSoup(html_data, 'html.parser') # 匹配同时包含两个指定td的tr target_tr = complete_soup.select_one('tr:has(td:contains("10.13.18.150")):has(td:contains("StreaNetwork"))') if target_tr: print(target_tr.prettify())
内容的提问来源于stack exchange,提问作者Tonin thomas
相关产品推荐
相关产品推荐

