0

私が必要とするデータは、の2つの異なる組み合わせの下にありtag + classます。関数で両方の組み合わせで検索し、両方でデータを一緒に表示したいと思います。両方の組み合わせは相互に排他的です。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、引数を1つだけ渡すので、2が必要です。この場合、2つの引数を渡す方法がわかりません。通常、私はこのような関数を呼び出したでしょうmatch_both2(example1,example2)。しかし、ここでは、自分の問題を解決できる方法を考えることができません。

この問題の解決にご協力ください。

4

1 に答える 1

0

関数を使用して一致する要素をフィルタリングする場合、結果ではなく関数のみへの参照を渡します。つまり、に渡す前に呼び出すことは想定されていません.findAll()

関数は、要素自体という1つの引数だけで呼び出されます。さらに、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', [])

この関数は、クラスを含むタグ、または3つのクラスすべてが存在Trueするpタグを返します。connectiondiv

findAll() それを呼び出さずにこれを渡します:

datas = soup.findAll(match_either)
于 2013-02-11T10:42:05.423 に答える