如何稳定提取包含固定类与动态变化类的div标签信息?
嘿,这个动态类名的坑我可踩过不少!其实完全不用正则就能完美解决你的问题,而且方法更简单可靠。
最优方案:只匹配固定的三个类,忽略动态类
BeautifulSoup 支持两种非常方便的方式来匹配同时拥有多个固定类的元素,不管元素有没有其他额外的类(比如那个动态的jssxxx):
方法1:使用class_参数传入类名列表
你可以直接把三个固定类名放进列表里,BeautifulSoup会自动匹配同时包含所有这些类的元素,完全无视其他类:
val = soup.find_all('div', class_=['abc', 'def', 'xyz'])
方法2:使用CSS选择器(更简洁推荐)
CSS选择器的多类选择器语法刚好适合这种场景,只要把固定类用.连起来,就能匹配同时拥有这些类的div:
val = soup.select('div.abc.def.xyz')
这两种方法的核心逻辑是一致的:只要目标div同时有abc、def、xyz这三个类,不管它还有没有其他动态生成的类(比如jss238或jss384),都会被匹配到。这样就彻底避免了动态类名变化导致的代码失效问题。
备选方案:用正则处理动态类(不推荐,除非必要)
如果你确实需要用到正则(比如某些特殊场景下固定类也有变化),也可以用正则表达式匹配完整的class属性:
import re # 匹配包含abc、def、jss+数字、xyz的class属性 val = soup.find_all('div', class_=re.compile(r'abc def jss\d+ xyz'))
不过这种方式可读性差,而且如果类名的顺序发生变化(虽然一般不会),正则就会失效,所以还是优先推荐前面两种方法。
内容的提问来源于stack exchange,提问作者Aklank Jain
相关产品推荐
相关产品推荐

