Разделить HTML на Regex - PullRequest
       3

Разделить HTML на Regex

0 голосов
/ 02 декабря 2018

Итак, у меня есть этот HTML:

div class="price" itemprop="offers" itemscope itemtype="http://schema.org Offer"

И я пытаюсь разбить его в списке что-то вроде этого:

[class="price", itemprop="offers", itemscope, itemtype="http://schema.org Offer"]

Но яЯ не уверен, как разделить часть itemscope.

Мое текущее регулярное выражение выглядит так (\s.*?\"\s*.*?\s*\"), но проблема с этим в том, что когда я разделю его на список, itemscope и itemtype = "http://schema.org Offer" будет только одним элементом, поэтому мой список будет выглядеть примерно так:

[class="price", itemprop="offers", itemscope itemtype="http://schema.org Offer"]

Есть идеи, как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Пакет lxml предлагает несколько удобных способов работы с xpath и атрибутами в элементах HTML.

Вот пример:

from io import StringIO
from lxml import etree

html = '<div class="price" itemprop="offers" itemscope itemtype="http://schema.org Offer"></div>'

tree = etree.parse(StringIO(html), etree.HTMLParser())
doc = tree.getroot()

xpaths = [tree.getpath(element) for element in doc.iter()]

print(xpaths)

attributes_ = ([(f'@{att}', node.attrib[att]) for att in node.attrib]
               for node in doc.iter())
attributes = [item for item in attributes_ if item]
print(attributes)

ВЫВОД:

['/ html', '/ html / body', '/ html / body / div']

[[('@ class', 'price'), ('@itemprop ',' offer '), (' @itemscope ',' '), (' @itemtype ',' http://schema.org Предложение ')]]

0 голосов
/ 02 декабря 2018

Если вы не хотите использовать Beautiful Soup, Python включает в себя модуль html.parser , который имеет HTML-парсер.Вот пример того, как его использовать.

(Я изменил пример HTML на правильно определенный div.)

from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):
    data = dict()

    def handle_starttag(self, tag, attrs):
        print("Encountered a start tag:", tag)
        for class_name, value in attrs:
            print(f'{class_name}: {value}')
            self.data[class_name] = value

    def handle_endtag(self, tag):
        print("Encountered an end tag :", tag)

    def handle_data(self, data):
        print("Encountered some data  :", data)

parser = MyHTMLParser()
html = '<div class="price" itemprop="offers" itemscope itemtype="http://schema.org Offer"></div>'
parser.feed(html)
print(parser.data)

ВЫХОД:

Обнаружен начальный тег: div

класс: цена

itemprop: предложения

itemcope: нет

itemtype: http://schema.org Offer

Обнаружен конечный тег:div

{'class': 'price', 'itemprop': 'offer', 'itemscope': None, 'itemtype': 'http://schema.org Offer'}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...