У мене є простий 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>