如何使用BeautifulSoup查找不包含指定class的标签?
你可以通过以下几种常见方案直接筛选出不含TFuture类的表格行:
方案1:CSS选择器(通用度最高,绝大多数爬虫库都支持)
直接用CSS的:not()伪类排除目标类,选择器语法为:tr:not(.TFuture)
该选择器在你的示例结构下,会自动匹配所有不带TFuture类的<tr>元素:
<tr class="TRow2 TPresent"> <tr class="TRow1 TPast"> <tr class="TRow2">
不同常用爬虫库的使用示例:
- BeautifulSoup 用法
from bs4 import BeautifulSoup soup = BeautifulSoup(页面源码文本, 'lxml') valid_rows = soup.select('tr:not(.TFuture)')
- PyQuery 用法
from pyquery import PyQuery as pq doc = pq(页面源码文本) valid_rows = doc('tr:not(.TFuture)')
- Selenium 用法
from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get(目标页面地址) valid_rows = driver.find_elements(By.CSS_SELECTOR, 'tr:not(.TFuture)')
方案2:XPath 方案
如果你的场景更适配XPath选择器,可以使用如下语法:
//tr[not(contains(@class, 'TFuture'))]
如果需要避免类名部分匹配(比如避免误筛到类名为TFutureOld这类包含TFuture字符串的元素),可以使用更严谨的写法:
//tr[not(contains(concat(' ', @class, ' '), ' TFuture '))]
Python 结合 lxml 使用示例:
from lxml import etree tree = etree.HTML(页面源码文本) valid_rows = tree.xpath("//tr[not(contains(@class, 'TFuture'))]")
方案3:手动遍历过滤(兼容性最好,适合所有场景)
如果所用工具不支持上述选择器语法,可以手动遍历所有行过滤:
from bs4 import BeautifulSoup soup = BeautifulSoup(页面源码文本, 'lxml') all_rows = soup.find_all('tr') valid_rows = [] for row in all_rows: # 获取当前行的class列表,默认返回空列表避免无class属性时报错 class_list = row.get('class', []) if 'TFuture' not in class_list: valid_rows.append(row)
内容的提问来源于stack exchange,提问作者Jeremy Sexton
相关产品推荐
相关产品推荐

