2012-11-30 90 views
1

html內容我也有類似的HTML文件如下:按順序分組按標籤

<h2>section 1</h2> 
    <p>para 1</p> 
    <p>para 2</p> 
    <p>para 3</p> 
    <h2>section 2</h2> 
    <p>para 1</p> 
    <p>para 2</p> 
    <p>para 3</p> 
    <h2>section 3</h2> 
    <p>para 1</p> 
    <p>para 2</p> 
    <p>para 3</p> 

我想刮那些到Python字典:{'section1':'...', 'section2':'...', 'section3':'...'},我當然可以設置一個current_section變量和使用while循環,但有沒有爲此目的的模塊? 我檢查了BeautifulSoup,但沒有找到一個捷徑。

謝謝!

回答

0

我想你想要string內建的split方法。如果您是在文本到達那裏是html_string你可以做

sections = html_string.split('<h2>') #this deletes the opening h2 tag 
for section in sections: 
    section = '<h2>' + section #replace the opening h2 tag 
    #code to parse each section goes here 

這應該是比使用while循環乾淨多了。

+3

這是一個壞主意 - 使用HTML解析器是更好的選擇。 –

+0

這可以將整個html頁面分成組,但不會將其中的文本提取到字典中。 – qed

1

據我知道有沒有沿soup.group_by_header()線的,但對於您所描述的輸入,你想要什麼是很簡單的在任何情況下實現:

>>> from bs4 import BeautifulSoup  
>>> html = """ 
...  <h2>section 1</h2> 
...  <p>para 1</p> 
...  <!-- etc. --> 
... """ 
>>> soup = BeautifulSoup(html) 
>>> sections = {} 
>>> for header in soup("h2"): 
...  paras = [] 
...  for sibling in header.find_next_siblings(text=False): 
...   if sibling.name == "h2": 
...    break 
...   paras.append(sibling.string) 
...  sections[header.string] = paras 
... 
>>> sections 
{u'section 1': [u'para 1', u'para 2', u'para 3'], 
u'section 2': [u'para 1', u'para 2', u'para 3'], 
u'section 3': [u'para 1', u'para 2', u'para 3']} 
>>> 

是這種做法有問題因某種原因,或者你只是想知道是否有一些聰明的BeautifulSoup方法圍繞着這套西裝(並且公平地說,有一些)?

+0

謝謝,這看起來非常好。但是,如果有的話,正如你所說,一些聰明的BeautifulSoup方法踢,請分享這些也,我會非常感激! – qed