2017-08-30 9 views
0

は、我々は、コードを持っていると仮定しましょう:パート

<tr class=" " somethingc1="" somethingc2="" somethingc3="" data-something="1" something="1something4" something_id="6something7"> 
<td class="text-center td_something"> 
<div> 
<span doo="true" class="foo" style="left:70%;z-index:99;"> 
<span doo="true" class="foo" style="left:50%;z-index:90;"> 
<span doo="true" class="Kung foo" style="left:90%;z-index:95;"> 
</div> 
</td> 
</tr> 
<tr class=" " somethingc1="" somethingc2="" somethingc3="" data-something="1" something="1something4" something_id="6something7"> 
<td class="text-center td_something"> 
<div> 
<span doo="true" class="Kung foo" style="left:35%;z-index:95;"> 
</div> 
</td> 
</tr> 
<tr class=" " somethingc1="" somethingc2="" somethingc3="" data-something="1" something="1something4" something_id="6something7"> 
<td class="text-center td_something"> 
<div> 
<span doo="true" class="foo" style="left:99%;z-index:100;"> 
</div> 
</td> 
</tr> 

にはどうすれば「左」の最高値を見つけるために、PythonでBS4を使用してリストを作ること

「クン」私は考慮する必要はありません念頭に置いて「スタイル」attrsにはclass_がでまたがるに

所望の結果は次のようになります。

[70,False or NaN,99] 

私はそれは私のような何かを開始する必要があります持っています:

trs = soup.find_all('tr', attrs={"data-something": "1"}) 
List = list() 
find_all('span',{'style': re.compile(r'^left:.')}) 

答えて

0
>>> import bs4 
>>> HTML = open('temp.htm').read() 
>>> soup = bs4.BeautifulSoup(HTML, 'lxml') 

まず、そのclass(それは同様何か他のものが含まれているかどうか)fooを含む要素のすべてを選択します。いずれの場合も

>>> elements = soup.select('.foo') 

element['class']は、このHTMLの場合にだけfooまたはfooKungのいずれか、すなわち、要素のclass内の項目のリストになります。したがって、element['class']の長さの試験は、foo単独の試験である。

element['style']は、要素の内容をstyleにします。必要な部分に正規表現を使用し、leftsというリストに追加します。

>>> lefts = [ ] 
>>> for element in elements: 
...  if len(element['class'])==1: 
...   lefts.append(int(bs4.re.search(r'left:([0-9]+)', element['style']).groups(0)[0])) 
... 
>>> 
>>> lefts 
[70, 50, 99] 

編集:

はクラスfooelementsを探し、その後、tr要素を検索します。これまでのように、クラスfooの要素だけを考慮に入れて、fooKungの両方を含めることはできません。これらの要素のためにleftスタイル要素を収集し、それらの最大値を見つけます。

>>> HTML = open('temp.htm').read() 
>>> import bs4 
>>> soup = bs4.BeautifulSoup(HTML, 'lxml') 
>>> trs = soup.findAll('tr') 
>>> tr_max = [] 
>>> for tr in trs: 
...  elements = tr.select('.foo') 
...  lefts = [ ] 
...  for element in elements: 
...   if len(element['class'])==1: 
...    lefts.append(int(bs4.re.search(r'left:([0-9]+)', element['style']).groups(0)[0])) 
...  if lefts: 
...   tr_max.append(max(lefts)) 
...  else: 
...   tr_max.append(None) 
... 
>>> tr_max 
[70, None, 99] 
+0

ありがとうございました!正確には、私が探しているものではありませんが、正しい方向に大きなプッシュを与えます! – PerfectionQuest

+0

私の喜び。私はそのHTMLから '[70、False or NaN、99]'を得る方法に困惑していました。 –

+0

それぞれの 'tr'の 'left'値を分離し、その中でmaxを探します。したがって、最初のものに2つの 'lefts'がある場合、それはより高くなるはずです。 2番目に有効な左辺がないので、False(または結果が整数である必要がある場合はNaN)、3番目の値は99になります。これはまだ解決しようとしている問題です。おそらく最大値は配列の要素ごとに簡単ですが、 'tr'でそれらを多様化するのは難しくなります。 – PerfectionQuest