/ / Как да разделим html страница на няколко страници, използвайки python и красива супа - python, html, beautifulsoup

Как да разделите HTML страница на няколко страници с помощта на Python и красива супа - python, html, beautifulsoup

Имам прост html файл като този. Всъщност аз го извадих от wiki страница, премахнах някои 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>

Четох този html файл с питон и красива супа по този начин.

from bs4 import BeautifulSoup

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

pages = []

Това, което бих искал да направя, е да разделим тази html страницадве части. Първата част ще бъде между първата и втората глава. А втората част ще бъде между вторите тагове <h2> и </body>. Тогава бих искал да ги съхранявам в списък например страници. Така че аз ще мога да създам няколко страници от html страница според <h2> таговете.

Някакви идеи за това как трябва да направя това? Благодаря..

Отговори:

3 за отговор № 1

Потърсете 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>