2

これらの 2 つのブロックを 1 つに結合できますか:

編集:Yacobyが回答で行ったようにループを結合する以外の方法。

for tag in soup.findAll(['script', 'form']):
    tag.extract()

for tag in soup.findAll(id="footer"):
    tag.extract()

また、複数のブロックを1つにすることもできます:

for tag in soup.findAll(id="footer"):
    tag.extract()

for tag in soup.findAll(id="content"):
    tag.extract()

for tag in soup.findAll(id="links"):
    tag.extract()

または、配列であるか、他のより単純な方法であるかを確認できるラムダ式があるかもしれません。

また、class は予約済みキーワードであるため、属性 class を持つタグを見つけるにはどうすればよいですか。

編集: この部分は、soup.findAll(attrs={'class': 'noprint'}) によって解決されます:

for tag in soup.findAll(class="noprint"):
    tag.extract()
4

4 に答える 4

8

.findall()次のように関数を渡すことができます。

soup.findAll(lambda tag: tag.name in ['script', 'form'] or tag['id'] == "footer")

ただし、最初にタグのリストを作成してから、それを反復する方がよい場合があります。

tags = soup.findAll(['script', 'form'])
tags.extend(soup.findAll(id="footer"))

for tag in tags:
    tag.extract()

複数の をフィルタリングする場合はid、次を使用できます。

for tag in soup.findAll(lambda tag: tag.has_key('id') and
                                    tag['id'] in ['footer', 'content', 'links']):
    tag.extract()

より具体的なアプローチは、idパラメーターにラムダを割り当てることです。

for tag in soup.findAll(id=lambda value: value in ['footer', 'content', 'links']):
    tag.extract()
于 2009-12-01T10:41:37.120 に答える
5

BeautifulSoup でよりエレガントに処理できるかどうかはわかりませんが、次のように 2 つのループをマージできます。

for tag in soup.findAll(['script', 'form']) + soup.findAll(id="footer"):
    tag.extract()

次のようなクラスを見つけることができます ( Documentation ):

for tag in soup.findAll(attrs={'class': 'noprint'}):
    tag.extract()
于 2009-12-01T10:05:26.690 に答える
0

質問の 2 番目の部分に対する答えは、ドキュメントにあります。

CSS クラスによる検索

attrs 引数は、CSS という 1 つのことがなければ、かなりあいまいな機能になります。特定の CSS クラスを持つタグを検索するのは非常に便利ですが、CSS 属性の名前である class も Python の予約語です。

soup.find("tagName", { "class" : "cssClass" }) を使用して CSS クラスで検索できますが、そのような一般的な操作には大量のコードが必要です。代わりに、辞書の代わりに attrs の文字列を渡すことができます。文字列は、CSS クラスを制限するために使用されます。

from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup("""Bob's <b>Bold</b> Barbeque Sauce now available in 
                   <b class="hickory">Hickory</b> and <b class="lime">Lime</a>""")

soup.find("b", { "class" : "lime" })
# <b class="lime">Lime</b>

soup.find("b", "hickory")
# <b class="hickory">Hickory</b>
于 2009-12-01T10:09:45.690 に答える