2017-08-30 51 views
0

假設我們有一些代碼:部分在Python BS4成爲可變

<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']將是項目的class爲元素,即一個列表,要麼只是foofooKung在這個HTML的情況。因此,對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] 

編輯:

找到tr元素,然後查找elementsfoo類。像以前一樣,只包括那些僅具有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或NaN,99]'感到困惑。 –

+0

這是關於分離每個「tr」的「左」值並尋找最大值,所以如果第一個中有兩個「左」,它應該帶來更高的值。第二個沒有有效的左邊,所以False(或NaN,如果結果必須是整數),第三個將是99.這是我嘗試解決的問題。數組的每個元素的最大值可能很容易,但使用'tr'來分散它們更加困難。 – PerfectionQuest