2015-02-10 25 views
0

我需要解析某些類名稱的跨度中未命名的br元素之間的某些文本。在這個例子中,我需要0.36,這是在這個例子中的命名屬性「DS」之後。在beautifulsoup中解析一個未命名的元素

這是我的嘗試。

from bs4 import BeautifulSoup 
html=""" 
<pre5 style="">              
    <br><br> 
    <span class="field-name">DS :</span>        
    0.36 [null]<br><br> <br> <span> <b>FC</b> </span><span> : 0.0 </span><br> <br> <span> <b>FDC</b> </span><span> : 0.36 </span><br> <br> <span> <b>LDD</b> </span><span> : 4838400000 </span><br> <br> <span> <b>IFS</b> </span><span> : 0.5333333 </span><br> 
    </pre5> 
""" 
soup = BeautifulSoup(html,'lxml') 
divTag = soup.find_all("pre5", {"style":""}) 

for tag in divTag: 
    tdTags = tag.find_all("span", {"class":"field-name"}) 
    for tag in tdTags: 
     print tag.text 
     # print DS :, but I want 0.36 


#Alternatively, 
soup = BeautifulSoup(html,'lxml') 
print str(soup.span.next_sibling.strip()).replace('[null]','') 
#prints 0.36 , but I would like to print by making sure that this element actually comes along with DS: and not just by the "immediate next sibilng" - is there a way to respect the named attribute DS and fetch the value for it ? 

解析/拆分/替換它通過字符串,會更慢,我可以直接使用樹結構嗎?

編輯,在這種情況下DS的值應該是0.007。無法保證DS將成爲跨班級的第一個元素。

html=""" 
<pre5 style="">              
    <br><br> 
    <span class="field-name">FC :</span>        
    0.36 [null]<br><br> <br> <span> <b>DS:</b> </span><span> : 0.007 </span><br> <br> <span> <b>FDC</b> </span><span> : 0.36 </span><br> <br> <span> <b>LDD</b> </span><span> : 4838400000 </span><br> <br> <span> <b>IFS</b> </span><span> : 0.5333333 </span><br> 
    </pre5> 
""" 

回答

0

如果我理解正確的話,你說你要提取的文本只是<span>標記之後,因此您可以使用next_element兩次。第一個用於標籤內的文本,第二個用於後面的文本。這似乎在這裏工作,就像這樣:

from bs4 import BeautifulSoup 
html=""" 
<pre5 style="">              
    <br><br> 
    <span class="field-name">DS :</span>        
    0.36 [null]<br><br> <br> <span> <b>FC</b> </span><span> : 0.0 </span><br> <br> <span> <b>FDC</b> </span><span> : 0.36 </span><br> <br> <span> <b>LDD</b> </span><span> : 4838400000 </span><br> <br> <span> <b>IFS</b> </span><span> : 0.5333333 </span><br> 
    </pre5> 
""" 
soup = BeautifulSoup(html,'lxml') 
divTag = soup.find_all("pre5", {"style":""}) 

for tag in divTag: 
    tdTags = tag.find_all("span", {"class":"field-name"}) 
    for tag in tdTags: 
     print tag.next_element.next_element.replace('[null]', '') 

它產生的(有一些空白,可以在事後刪除):

0.36 
+0

您的代碼仍然假定span class =「field-name」> DS:會先到達。你可以編輯這個以確保如果DS:是跨度類中的第二個,我們仍然會得到「DS」的正確的浮點數 – ekta 2015-02-10 22:09:25

+0

@ekta:我沒有得到新的'xml'數據和​​你的解釋。你可以編輯你的問題,並添加它來檢查我的解決方案不適合什麼方式? – Birei 2015-02-10 23:16:35

+0

@Birel請參閱上面的編輯 – ekta 2015-02-11 03:35:53

2

由於文字DS可以是一個<span><b>標籤內,還可以對數據進行一個<span>標籤內,您可以搜索這樣的標籤:

html = """ 
<pre5 style=""> 
    <br><br> 
    <span class="field-name">DS :</span> 
    0.36 [null]<br><br> <br> <span> <b>FC</b> </span><span> : 0.0 </span><br> <br> <span> <b>FDC</b> </span><span> : 0.36 </span><br> <br> <span> <b>LDD</b> </span><span> : 4838400000 </span><br> <br> <span> <b>IFS</b> </span><span> : 0.5333333 </span><br> 
    </pre5> 
<pre5 style=""> 
    <br><br> 
    <span class="field-name">FC :</span> 
    0.36 [null]<br><br> <br> <span> <b>DS:</b> </span><span> : 0.007 </span><br> <br> <span> <b>FDC</b> </span><span> : 0.36 </span><br> <br> <span> <b>LDD</b> </span><span> : 4838400000 </span><br> <br> <span> <b>IFS</b> </span><span> : 0.5333333 </span><br> 
    </pre5> 
""" 

soup = BeautifulSoup(html, 'lxml') 
divTag = soup.find_all("pre5", {"style": ""}) 

import re 

for tag in divTag: 
    tdTags = tag.find_all(["span", "b"], text=re.compile(r'DS\s*:')) 
    for tag in tdTags: 
     if tag.nextSibling.strip(): 
      print tag.nextSibling.replace('[null]', '').strip() 
     else: 
      print tag.findNext("span").text.replace(':', '').strip() 

這會給你的輸出:

0.36 
0.007