我需要的数据存在于tag + class
的2个不同组合下。我希望我的功能可以在两种组合下进行搜索,并将两者下的数据一起呈现。两种组合都是互斥的。如果存在1个组合则其他组合不存在。
我使用的代码是:
# -*- coding: cp1252 -*-
import csv
import urllib2
import sys
import urllib
import time
from bs4 import BeautifulSoup
from itertools import islice
def match_both2(arg1,arg2):
if arg1 == 'div' and arg2 == 'DetailInternetFirstContent empty openPostIt':
return True
if arg1 == 'p' and arg2 == 'connection':
return True
return False
page = urllib2.urlopen('http://www.sfr.fr/mobile/offres/toutes-les-offres-sfr?vue=000029#sfrintid=V_nav_mob_offre-abo&sfrclicid=V_nav_mob_offre-abo').read()
soup = BeautifulSoup(page)
datas = soup.findAll(match_both2(0),{'class':match_both2(1)})
print datas
现在,我正在尝试使用match_both2
函数来完成此任务,但它正在给我TypeError
,因为我只传递了一个参数,它需要2.我不知道在这种情况下如何传递2个参数,通常我会调用函数类似于match_both2(example1,example2)
。但在这里,我无法想到一种可以解决我问题的方法。
请帮我解决这个问题。
答案 0 :(得分:0)
使用函数过滤匹配元素时,只传递对函数的引用,而不是结果。换句话说,在将它传递给.findAll()
之前,你不应该调用它。
仅使用一个参数调用该函数,该元素本身。此外,class
属性已拆分为列表。因此,为了匹配您的特定元素,您需要将匹配函数改为:
def match_either(tag):
if tag.name == 'div':
# at *least* these three classes must be present
return {'DetailInternetFirstContent', 'empty', 'openPostIt'}.issubset(tag.get('class', []))
if tag.name == 'p':
# at *least* this one class must be present
return 'connection' in tag.get('class', [])
此函数返回True
一个p
标记connection
或div
标记,其中包含所有三个类。
将此传递给findAll()
而不调用:
datas = soup.findAll(match_either)