2015-07-21 37 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