2015-07-21 86 views
1

我將多個類值傳遞給BeautifulSoup.find_all()。該值類似於l4 centerl5 center。 (即,"l4 center" | "l5 center")。將正則表達式傳遞給'BeautifulSoup.find_all'不起作用

soup.find_all("ul", {"class" : value) 

我失敗(輸出沒有)這樣做有以下兩種解決方案:

soup.find_all("ul", {"class" : re.compile("l[4-5]\scenter")}) 

#OR 

soup.find_all("ul", {"class" : ["l4 center", "l5 center"]}) 

的源代碼如下:

#!/usr/bin/env python3 

from bs4 import BeautifulSoup 
import bs4 
import requests 
import requests.exceptions 
import re 

### function, , .... ### 
def crawler_chinese_idiom(): 
    url = 'http://chengyu.911cha.com/zishu_8.html' 
    response = requests.get(url)  
    soup = BeautifulSoup(response.text) 

    #for result_set in soup.find_all("ul", class=re.compile("l[45] +center")): #l4 center or l5 center 
    for result_set in soup.find_all("ul", {"class", re.compile(r"l[45]\s+center")}): #nothing output 
    #for result_set in soup.find_all("ul", {"class" : "l4 center"}): #normal one 
     print(result_set) 


crawler_chinese_idiom() 
#[] output nothing 
+0

嘗試're.compile(r「l [45] \ s + center」)'。沒有'r',你需要使用''s'',並且'[45]'已經意味着4或者5. –

+0

你是什麼意思*它不起作用*? – styvane

+1

你的數據是什麼樣的? – hwnd

回答

1

更新:解決https://bugs.launchpad.net/bugs/1476868


起初我以爲問題是class='l4 center'在HTML中實際上是兩個類 - 認爲湯不匹配,因爲它正在尋找一個包含空間(不可能)的類。

嘗試:

from bs4 import BeautifulSoup 
import re 
soup = BeautifulSoup("<html><div class='l5 center'>l5test</div><div class='l4 center'>l4test</div><div class='l6 center'>l6test</div>") 

results1 = soup.findAll('div', re.compile(r'l4 center')); 
print results1 
results2 = soup.findAll('div', 'l4 center'); 
print results2 

輸出:

[] 
[<div class="l4 center">l4test</div>] 

但等待?非正則表達式選項工作正常 - 它找到了兩個類。

在這一點上,它看起來像一個BeautifulSoup錯誤。

要解決它,你可以這樣做:

soup.findAll('div', ['l4 center', 'l5 center']); 
# update:^that doesn't work either. 
# or 
soup.findAll('div', ['l4', 'l5', 'center']); 

我推薦第二個剛要匹配l4 otherclass center情況,但肯定你不」,你可能需要重複的結果,使在那裏沒有任何不需要的捕獲。例如:

for result in soup.findAll(...): 
    if (result.find({'class': 'l4'}) and result.find({'class': 'center'}): 
     # yay! 

我提交了一個缺陷here進行調查。

+0

'soup.findAll('div',['l4 center','l5 center']);'不起作用。沒有輸出。 – SparkAndShine

+1

你說得對。第二個工作。 – brandonscript

+0

它適合我。 'soup.findAll('div',['l4','l5','center']);' – SparkAndShine