Erd*_*dem 6 html python beautifulsoup
我有一个像这样的简单html文件.事实上,我从维基页面中删除了它,删除了一些html属性并转换为这个简单的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>
Run Code Online (Sandbox Code Playgroud)
我用这样的python和漂亮的汤读了这个html文件.
from bs4 import BeautifulSoup
soup = BeautifulSoup(open("test.html"))
pages = []
Run Code Online (Sandbox Code Playgroud)
我想做的是将这个html页面分成两部分.第一部分将在第一个标题和第二个标题之间.第二部分将位于第二个标题<h2>和</ body>标记之间.然后我想将它们存储在列表中,例如.页面.所以我可以根据<h2>标签从html页面创建多个页面.
关于我该怎么做的任何想法?谢谢..
查找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))
Run Code Online (Sandbox Code Playgroud)
使用您的样本,可以得出:
>>> 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>
Run Code Online (Sandbox Code Playgroud)