4

次のコードを使用して、CSSクラス「ad_item」を持つすべてのdivを照合しています。

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

私が抱えている問題は、そのWebページに、CSSクラスが「ad_ex_item」と「ad_ex_item」に設定されているdivもあることです。

<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

ラムダ関数をメソッドに渡すことができfindますfind_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', [])回避します。KeyErrordivclass

複数のクラスを除外する必要がある場合は、最後の条件を次のように置き換えることができます。

    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")

残念ながら、:notCSS3のセレクターはサポートされていないようです。これが本当に必要な場合は、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ループをクリーンに保つ方法、または1行のソリューションのような方法が必要な場合は、以下のリスト内包表記を使用してください。

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 に答える