2014-03-25 56 views
0

我正在使用BeautifulSoup的(python)find_all函數與正則表達式從網頁上刮掉一些數據。具體來說,我從here中挖出個別分類廣告。如果檢查每個所分類的廣告,可以看到它們通常包封在以下任一的div:看似簡單的Python正則表達式不匹配

<div class="item c-b-#">...</div> 

<div class="item c-b-# premium">...</div> 

#哪裏是一個數字(通常爲0或2)。

這裏我的目標是用正則表達式來區分這兩者。下面是我做了什麼:

regularAds = soup.find_all('div', attrs={'class': re.compile('item.*')}) 

premiumAds = soup.find_all('div', attrs={'class': re.compile('item.*premium')}) 

前者作品expeced - 返回所有公告(包括地價),但後者返回無。它有什麼問題?爲什麼不'item.*premium'映射到第二個div類?

作爲次要的問題:我將如何改變第一正則表達式說:「我希望所有那些有字'item'但不字'premium'

編輯

以供將來參考:後一個小試驗和錯誤的答案我二次的問題變成了:。

regularAds = [tag for tag in soup.find_all('div', attrs={'class': re.compile('item')}) if 'premium' not in tag['class']] 

這很好地工作

回答

0

我的快速猜測是class美麗的湯基本上是調用class.split(' ')對類屬性的實際文本的結果。如果你這樣做:

premiumAds = soup.find_all('div', attrs={'class': 'premium'}) 
+0

哇...它的工作!我從來不會猜到。我認爲有點怪異的行爲。不完全直觀,但它解釋了很多(我以前曾經遇到過類似的問題)。謝謝! –

+0

很高興幫助!我認爲這樣做與'classList'類似。 –

0

古怪IDD作爲你的第二個正則表達式應該明確工作:

>>> soup = BeautifulSoup('<div class="item c-b-#">text1</div><div class="item c-b-# premium">text2</div>') 
>>> soup.findAll('div', attrs={'class': re.compile('item.*premium')}) 
[<div class="item c-b-# premium">text2</div>] 

什麼soup.findAll('div', attrs={'class': re.compile('^item((?!premium).)*$')})你的最後一個問題。

+0

我很確定正則表達式本身是正確的,但參考。 @sam上面的建議,類屬性被拆分爲'',所以幾乎縮小了它的範圍。你的正則表達式工作正常,但;返回與'。* item。*'相同的內容。 –