/ / Як розділити HTML-сторінку на кілька сторінок за допомогою python та красивого супу - python, html, beautifulsoup

Як розділити html-сторінку на кілька сторінок за допомогою python і прекрасного супу - python, html, 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>

Я читаю цей html-файл, використовуючи python і красивий суп, як це.

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>