Примечание
Вы не предоставили никакого контекста или примера того, как выглядят ваши данные.
Таким образом, мой ответ будет таким, каким я представляю себе среднюю проблему синтаксического анализа HTML быть, а в худшем случае это может оказаться бесполезным.
В будущих вопросах приведите минимальный пример того, какова ваша настоящая проблема, что вы пытались и какие у вас есть данные, а также какие они есть. необходимо преобразовать в.
Ответ
Для анализа чего-то простого, например
<html>
<p>Hello <b>world</b></p>
</html>
Вы можете использовать html .parser :
from html.parser import HTMLParser
class Values(HTMLParser):
def __init__(self, *args, **kwargs):
self.data = {}
self.current_tag = None
super().__init__(*args, **kwargs)
def handle_starttag(self, tag, attrs):
self.current_tag = tag
def handle_endtag(self, tag):
self.current_tag = None
def handle_data(self, data):
self.data[self.current_tag] = data
parser = Values()
parser.feed('<html><p>Hello <b>world</b></p></html>')
print(parser.data)
Исходя из вашего вопроса, я предполагаю, что у вас нет идентичных тегов, дублированных где-либо в отдельных записях, и этого вида синтаксического анализа достаточно для получения этого:
{'p': 'Hello ', 'b': 'world'}
Теперь вы знаете, что вы нашли Hello
в paragraph
, а world
было bold
.
Полученный словарь позволяет легко получить доступ к parser.data['b']
/ .data['p']
для доступа к соответствующим данным. и делай, что хочешь.
Было бы более надежным, если ты У nstead был список за каждым тегом
{ 'p': ['Hello '], 'b': ['world'] }
, но я исключил это для простоты.
Если я вместо этого сохранил список тегов, я добавил новый тег в указанный список и удалил последний добавленный тег из списка на каждые handle_starttag
и handle_endtag
, тогда я мог бы использовать '.'.join(self.current_tags)
в качестве ключа словаря.
В результате появился бы словарь, подобный этому:
{ 'html.p': 'Hello ', 'html.p.b': 'world' }
Для более сложных входных данных вы должны реализовать любой лог c, необходимый для разграничения данных, то же самое можно сказать и о результирующей структуре данных, все зависит от того, что вам действительно нужно.
В качестве альтернативы , вы можете использовать библиотеку, которая делает для вас самую тяжелую работу, которую я бы порекомендовал: BeautifulSoup .