2013-01-21 17 views
4

我有一個這樣的簡單html文件。事實上,我從一個wiki頁面中取出它,刪除了一些html屬性並轉換爲這個簡單的html頁面。如何使用python和美麗的湯將一個html頁面分割爲多個頁面

<html> 
    <body> 
     <h1>draw electronics schematics</h1> 
     <h2>first header</h2> 
     <p> 
     <!-- ..some text images --> 
     </p> 
     <h3>some header</h3> 
     <p> 
     <!-- ..some image --> 
     </p> 
     <p> 
     <!-- ..some text --> 
     </p> 
     <h2>second header</h2> 
     <p> 
     <!-- ..again some text and images --> 
     </p> 
    </body> 
</html> 

我用python和美麗的湯這樣讀這個html文件。

from bs4 import BeautifulSoup 

soup = BeautifulSoup(open("test.html")) 

pages = [] 

我想要做的是將這個HTML頁面分成兩部分。第一部分將在第一個標題和第二個標題之間。第二部分將在第二個標頭< h2>和</body>標籤之間。然後,我想將它們存儲在列表中,例如。頁面。所以我可以根據< h2>標籤從html頁面創建多個頁面。

任何想法,我應該如何做到這一點?謝謝..

回答

3

外觀爲h2標籤,然後使用.next_sibling抓住一切直到它的另一個h2標籤:

soup = BeautifulSoup(open("test.html")) 
pages = [] 
h2tags = soup.find_all('h2') 

def next_element(elem): 
    while elem is not None: 
     # Find next element, skip NavigableString objects 
     elem = elem.next_sibling 
     if hasattr(elem, 'name'): 
      return elem 

for h2tag in h2tags: 
    page = [str(h2tag)] 
    elem = next_element(h2tag) 
    while elem and elem.name != 'h2': 
     page.append(str(elem)) 
     elem = next_element(elem) 
    pages.append('\n'.join(page)) 

使用您的樣品,這給:

>>> pages 
['<h2>first header</h2>\n<p>\n<!-- ..some text images -->\n</p>\n<h3>some header</h3>\n<p>\n<!-- ..some image -->\n</p>\n<p>\n<!-- ..some text -->\n</p>', '<h2>second header</h2>\n<p>\n<!-- ..again some text and images -->\n</p>'] 
>>> print pages[0] 
<h2>first header</h2> 
<p> 
<!-- ..some text images --> 
</p> 
<h3>some header</h3> 
<p> 
<!-- ..some image --> 
</p> 
<p> 
<!-- ..some text --> 
</p> 
+0

很不錯的解決方案。非常感謝你! :)現在我試着瞭解發生了什麼。 – Erdem

+0

@Erdem:'.next_sibling'屬性包含NavigableString對象(基本上是元素之間的文本)和'next_element()'函數會跳過這些對象。否則,它只是添加每個下一個兄弟姐妹,直到你再次碰到'h2'或者沒有兄弟姐妹。 –

+0

謝謝@Martijn。希望我能夠使用引導模板創建網頁,例如您的網頁或learn.adafruit.com – Erdem

相關問題