如何用BeautifulSoup同时提取无class和指定class的td元素?
解决方法
要同时提取无class属性的<td>和class为sem_dados的<td>并保留原顺序,有两种靠谱的写法:
方法1:用lambda过滤器
直接给class_参数传一个lambda表达式,判断元素的class属性要么是None(无class),要么等于sem_dados:
object.find_all("td", class_=lambda x: x is None or x == "sem_dados")
方法2:用CSS选择器
通过CSS选择器组合两种规则,td:not([class])匹配无class的td,td.sem_dados匹配指定class的td:
object.select("td:not([class]), td.sem_dados")
为什么原来的写法不行?
BeautifulSoup的class_参数传入列表时,是匹配class属性值包含列表中任意项的元素,但列表里的None会被当成要匹配“class属性值为None”的元素(实际网页里几乎没有这种情况),而不是匹配“没有class属性”的元素,所以之前的写法拿不到无class的td。
内容的提问来源于stack exchange,提问作者Joao Francisco Pugliese
相关产品推荐
相关产品推荐

