簡體   English   中英

Python中BS4 find_all()語句中的過濾功能問題

[英]Filtering function issues in BS4 find_all() statement in Python

我正在抓取HTML網頁。 我在Mac(Sierra)上使用BeautifulSoup lib(4.6.0)和Python(3.7)。

除其他外,我看到了一堆具有類屬性的“ div”標簽。 一些'div'標簽帶有多個類屬性值。 現在,我想根據標簽名稱和類屬性值進行過濾,例如,我想找到具有class ='a'但沒有class ='b'的'div'標簽(是的,有些div標簽隨附class ='a b')。

為了獲得這些標簽,我嘗試使用BS4文檔( https://www.crummy.com/software/BeautifulSoup/bs4/doc/#a-function )中提到的過濾功能。 我的印象是find_all()將bs4標簽元素傳遞給該函數,並且在該函數內您可以執行對BS4標簽元素的任何操作。 這似乎是不正確的。 我得到一個字符串,顯然所有我的BS4標簽元素操作都引發了異常。

兩個問題:

  1. find_all()究竟將什么傳遞給函數,以及如何使用該參數?
  2. 除了功能之外,如何才能實現所需的功能?

我的印象是find_all()將bs4標簽元素傳遞給該函數,並且在該函數內您可以執行對BS4標簽元素的任何操作。

您的印象是正確的。 從bs4文檔(重點是我的):

...定義一個以元素為唯一參數的函數。

因此,文檔中的每個元素都將傳遞給filter函數,如果函數對該元素返回True ,則該元素將包含在.find_all()返回的元素列表中。 實際上,這只能用作最后的選擇,因為它可能會占用大量性能。 我不完全確定為什么要獲取字符串,一種可能是將函數傳遞給class_=參數,該參數確實傳遞了字符串,但是不能不看代碼就說不出來。

我認為您應該做的是使用.find_all()獲取具有類“ a”的所有<div> ,然后使用自己的方法過濾那些以僅包括那些不包含類“ b”的類:

divs = soup.find_all('div', class_='a')
filtered_divs = [ div for div in divs if 'b' not in div.attrs['class'].split(' ') ]

但是,如果您確實想使用過濾器功能,它看起來就像

class_a_not_b(e):
    if 'class' not in e.attrs: return False
    return 'a' in e.attrs['class'].split(' ') and 'b' not in e.attrs['class'].split(' ')

divs = soup.find_all(class_a_not_b)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM