2017-08-28 100 views
0

我剛剛開始使用Python進行編碼,我的朋友問我應用程序在網絡上找到特定的數據,很好地表示它。 我已經找到漂亮的網頁,其中包含數據,我可以找到基本信息,但接下來的挑戰是要深入。bs4 parent attrs python

雖然在Python 3.4使用BS4我已經達到了示範代碼:

<tr class=" " somethingc1="" somethingc2="" somethingc3="" data-something="1" something="1something6" something_id="6something0"> 
<td class="text-center td_something"> 
<div> 
<a href="something/126" target="_blank">Super String of Something</a> 
</div> 
</td> 
<td class="text-center">08/26 15:00</td> 
<td class="text-center something_status"> 
<span class="something_status_something">Full</span> 
</td> 
</tr> 
<tr class=" " somethingc1="" somethingc2="" somethingc3="" data-something="0" something="1something4" something_id="6something7"> 
<td class="text-center td_something"> 
<div> 
<a href="something/146" target="_blank">Super String of Something</a> 
</div> 
</td> 
<td class="text-center">05/26 15:00</td> 
<td class="text-center something_status"> 
<span class="something_status_something"></span> 
</td> 
</tr> 

我想現在要做的是找到的日期字符串,但只有當數據出頭=的父母,而不是如「1」數據出頭=「0」

我可以放棄所有日期:

soup.find_all(lambda tag: tag.name == 'td' and tag.get('class') == ['text-center'] and not tag.has_attr('style')) 

,但它不檢查父。這就是爲什麼我嘗試過:

def KieMeWar(tag): 
    return tag.name == 'td' and tag.parent.name == 'tr' and tag.parent.attrs == {"data-something": "1"} #and tag.get('class') == ['text-center'] and not tag.has_attr('style') 
soup.find_all(KieMeWar) 

結果是一個空集。什麼是錯誤的或如何達到我期望的最簡單解決方案的目標?

P.S.這是完整代碼的示例性部分,這就是爲什麼我不使用Style的原因,即使它沒有出現在這裏,但是稍後會出現。

+0

也許你能夠做到這與XPath的引用。 –

回答

1

BeautifulSoup的findAllattrs kwarg,這是用來找到一個給定的屬性

import bs4 
soup = bs4.BeautifulSoup(html) 
trs = soup.findAll('tr', attrs={'data-something':'1'}) 

那找到所有tr標籤與屬性data-something="1"標籤。然後,您可以依次通過trs和搶第二td標籤提取日期

for t in trs: 
    print(str(t.findAll('td')[1].text)) 
    >>> 08/26 15:00 
+0

但是,在代碼的其他部分是另一個字符串在不同的'td'下,所以我也會有多個錯誤的答案。我不是嗎? 無論如何謝謝你!無論如何,我會嘗試實施這種方法進行測試。 – PerfectionQuest

+0

工作得很好。現在我只需要弄清楚爲什麼:)再次感謝! – PerfectionQuest