Получить html под тегом, используя htmlparser python

Я хочу получить весь html под тегом и использовать HTMLParser. Я могу в настоящее время получить данные между тегами, а следующий – мой код

class LinksParser(HTMLParser): def __init__(self): HTMLParser.__init__(self) self.recording = 0 self.data = '' def handle_starttag(self, tag, attributes): if tag != 'span': return if self.recording: self.recording += 1 return for name, value in attributes: if name == 'itemprop' and value == 'description': break else: return self.recording = 1 def handle_endtag(self, tag): if tag == 'span' and self.recording: self.recording -= 1 def handle_data(self, data): if self.recording: self.data += data 

Я также хочу, чтобы html-теги внутри ввода, например

 <span itemprop="description"> <h1>My First Heading</h1> <p>My first <br/><br/>paragraph.</p> </span> 

когда они предоставляются в качестве входных данных, я получаю только данные с тегами. Есть ли какой-либо метод, с помощью которого я могу получить целые html между тегами?

  • Как изменить имя тега с помощью BeautifulSoup?
  • python, извлекающий атрибуты HTML-тега без регулярных выражений
  • Ускорение прекрасного
  • Анализ HTML не выводит требуемые данные (информация отслеживания для FedEx)
  • Использование Beautiful Soup для преобразования атрибутов CSS в отдельные атрибуты HTML?
  • Установите lxml в качестве парсера BeautifulSoup по умолчанию
  • Извлечение выделенных столбцов из таблицы с помощью BeautifulSoup
  • Используйте BeautifulSoup, чтобы получить значение после определенного тега
  • 2 Solutions collect form web for “Получить html под тегом, используя htmlparser python”

    Можно использовать xml.etree.ElementTree.TreeBuilder для использования API etree для поиска / управления элементом <span> :

     import sys from HTMLParser import HTMLParser from xml.etree import cElementTree as etree class LinksParser(HTMLParser): def __init__(self): HTMLParser.__init__(self) self.tb = etree.TreeBuilder() def handle_starttag(self, tag, attributes): self.tb.start(tag, dict(attributes)) def handle_endtag(self, tag): self.tb.end(tag) def handle_data(self, data): self.tb.data(data) def close(self): HTMLParser.close(self) return self.tb.close() parser = LinksParser() parser.feed(sys.stdin.read()) root = parser.close() span = root.find(".//span[@itemprop='description']") etree.ElementTree(span).write(sys.stdout) 

    Вывод

     <span itemprop="description"> <h1>My First Heading</h1> <p>My first <br /><br />paragraph.</p> </span> 

    Для печати без тега parent (root) <span> :

     sys.stdout.write(span.text) for child in span: sys.stdout.write(etree.tostring(child)) # add encoding="unicode" on Python 3 

    Вот что-то, что выполняет работу на основе тестовых данных, которые вы предоставили с минимальными изменениями в вашем существующем коде (при условии, что это в основном делает то, что вы хотите уже). Вероятно, вы захотите расширить его, чтобы более эффективно использовать самозакрывающиеся теги:

     from HTMLParser import HTMLParser class LinksParser(HTMLParser): def __init__(self): HTMLParser.__init__(self) self.recording = 0 self.data = '' self.self_closing_tags = ("br",) def handle_starttag(self, tag, attributes): if tag not in ('span',) + self.self_closing_tags: self.data += "<%s" % (tag,) if attributes: self.data += " " + " ".join('%s="%s"' % (k, v) for k, v in attributes) self.data += ">" return if self.recording: self.recording += 1 return for name, value in attributes: if name == 'itemprop' and value == 'description': break else: return self.recording = 1 def handle_endtag(self, tag): if tag == 'span' and self.recording: self.recording -= 1 elif tag in self.self_closing_tags: self.data += "<%s/"> % (tag,) else: self.data += "</%s>" % (tag,) def handle_data(self, data): if self.recording: self.data += data 

    Учитывая это как ввод:

     <span itemprop="description"> <h1>My First Heading</h1> <p>My first <br/><br/>paragraph.</p> </span> 

    выход:

     <h1>My First Heading</h1> <p>My first <br/><br/>paragraph.</p> 
    Python - лучший язык программирования в мире.