Подробности: MacOS, Python3, BeautifulSoup4
Я новичок в Python и еще новее в BeautifulSoup, поэтому, пожалуйста, извините за любые ошибки новичка здесь.Я пытаюсь очистить HTML-страницы, которые не сильно дифференцируют свои теги по классам или идентификаторам.Другими словами, я пытаюсь очистить среднюю часть списка.Список будет иметь непредсказуемое количество тегов и элементов (иногда они используют неупорядоченный список, иногда они используют список описания), поэтому то, что я собираю, довольно непредсказуемо, однако у меня есть две известные переменные, и они будуттекст строки заголовка, с которого я хочу начать, и текст строки заголовка, с которым я хочу завершить.
Я собрал следующий пример html для проверки этого:
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">First Section Title - Known Variable or String</h3>
</div>
</div>
<div>
<ul class="unstyled">
<li>Item1</li>
<li>Item2</li>
<li>Empty LI Tags Also Exist</li>
</ul>
<dl class="dl-horizontal">
<dt>Title of some description list</dt>
<dd>Another item may exist here</dd>
</dl>
</div>
<div>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Another Section Title</h3>
</div>
</div>
<ul class="unstyled">
<li>Item1</li>
<li></li>
</ul>
<dl class="dl-horizontal">
<dt>Another Description List Title</dt>
<dd>Another item may exist here</dd>
<dt>And here</dt>
<dd>And Here</dd>
</dl>
</div>
<div>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Section Title (String) I Wish To Stop At - Known Variable or String</h3>
</div>
</div>
</div>
Снова, используяПриведенная выше модель, я хочу начать с первого раздела, который я перечислил, и закончить на известной текстовой строке определенного раздела внизу.
Я перечислил свой скрипт на Python ниже.Пока что следующий Python собирает правильную информацию, однако я не верю, что она будет работать при любых обстоятельствах, и, вероятно, есть более эффективный способ сделать это.Вот некоторые из проблем, которые, по моему мнению, заключены в моем сценарии:
Мой сценарий довольно статичен - хотя он начинается с правильного заголовка, я выделил два раздела по отдельности, так как яне верьте, что мой цикл For работает так, как он должен быть (я не думаю, что ## раздел 2 необходим, если написано правильно).
Поскольку мой цикл For, вероятно, не работаетто, что я, вероятно, думаю, это (я хотел бы, чтобы это перебирало разделы) Мне никогда не приходилось определять точку остановки (строку текста в разделе, на котором я хочу остановиться).
Поскольку я не уверен, что цикл работает правильно, я не верю, что он будет обрабатывать любые кривые, которые я выбрасываю на сайт - например, переменное количество элементов в списке, и если они добавляют дополнительный раздел, который я хотел бы междуопределены «Начальный раздел» и «Конечный раздел».
Я считаю, что должно произойти:
- Библиотеки должны быть импортированы
- Найти первый раздел
- Найти следующего брата
- Продолжать находить братьев и сестер и возвращать текст до тех пор, пока строка соответствия не будет соответствовать
Python:
##Scrape
#import beautifulsoup and requests library
from bs4 import BeautifulSoup
import requests
soup = BeautifulSoup(open("mock.html"), "html.parser")#BeautifulSoup(page.read())
#Begin by grabbing the section
stuff = soup.find_all(class_="panel-heading")
#Search for the first section title text string
next_elem = soup.find(text="First Section Title - Known Variable or String").findNext('li').contents[0]
#Attempt to scan the remainder of the section, starting with the next line item
next_next = next_elem.parent.find_next_sibling()
for item in next_next.findAll('li','dt','dd'):
if isinstance(item, Tag):
print(item.text)
print(next_elem)
print(next_next.text)
##Section 2 - I'd like to cut this out
s2_elem = soup.find(text="Another Section Title").findNext('li').contents[0]
s2_nxnx = s2_elem.parent.find_next_sibling()
s2_nxnxnx = s2_nxnx.parent.find_next_sibling()
print(s2_elem)
print(s2_nxnx.text)
print(s2_nxnxnx.text)