4

我正在使用以下代码来匹配所有具有 CSS 类“ad_item”的 div。

soup.find_all('div',class_="ad_item")

我遇到的问题是,在该网页上,还有 div 将 CSS 类设置为“ad_ex_item”和“ad_ex_item”。

<div class="ad_item ad_ex_item">

在文档中指出:

当您搜索与某个 CSS 类匹配的标签时,您将匹配其任何 CSS 类:

那么如何匹配只有“ad_item”而没有“ad_ex_item”的 div。

或者换句话说,如何搜索只有 CSS 类 "ad_item" 的 div ?

4

7 回答 7

8

我找到了一种解决方案,虽然它与BS4无关,但它是纯python代码。

for item in soup.find_all('div',class_="ad_item"):
     if len(item["class"]) != 1:
         continue;

如果有多个 CSS 类,它基本上会跳过项目。

于 2013-01-25T06:48:32.880 回答
8

您可以使用这样的严格条件:

soup.select("div[class='ad_item']")

div与确切的课程相得益彰。在这种情况下,只有'ad_item'空间类加入,没有其他人加入。

于 2018-02-27T23:06:05.377 回答
2

您可以将 lambda 函数传递给findfind_all方法。

soup.find_all(lambda x:
    x.name == 'div' and
    'ad_item' in x.get('class', []) and
    not 'ad_ex_item' in x['class']
)

x.get('class', [])将避免没有属性的标签的KeyError异常。divclass

如果您需要排除多个类,您可以将最后一个条件替换为:

    not any(c in x['class'] for c in {'ad_ex_item', 'another_class'})

如果你想排除一些你可以使用的类:

   not all(c in x['class'] for c in {'ad_ex_item', 'another_class'})
于 2017-06-09T13:40:23.417 回答
0

您是否尝试使用selecthttp ://www.crummy.com/software/BeautifulSoup/bs4/doc/#css-selectors

soup.select(".add_item")

不幸的是,似乎:not不支持 CSS3 的选择器。如果您真的需要这个,您可能需要查看lxml。它似乎支持它。见http://packages.python.org/cssselect/#supported-selectors

于 2013-01-24T09:30:38.860 回答
0

您始终可以编写一个与您想要的标签匹配的 Python 函数,并将该函数传递给 find_all():

def match(tag):
    return (
        tag.name == 'div'
        and 'ad_item' in tag.get('class')
        and 'ad_ex_item' not in tag.get('class'))

soup.find_all(match)
于 2013-01-24T15:18:45.333 回答
0

最佳答案是正确的,但如果您想要一种方法来保持 for 循环干净或喜欢单行解决方案,请使用下面的列表理解。

data = [item for item in soup.find_all("div", class_="ad_item") if len(item["class"]) == 1] 
于 2019-06-14T16:39:54.770 回答
-3
soup.fetch('div',{'class':'add_item'})
于 2013-01-24T08:50:52.953 回答