4

タグの下にHTMLParserを使用してHTML全体を取得したいと思います。現在、タグ間のデータを取得できます。以下は私のコードです

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全体を取得できる方法はありますか?

4

2 に答える 2

5

要素xml.etree.ElementTree.TreeBuilderを検索/操作するためにetreeAPIを利用するために使用できます。<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>

親(ルート)<span>タグなしで印刷するには:

sys.stdout.write(span.text)
for child in span:
    sys.stdout.write(etree.tostring(child)) # add encoding="unicode" on Python 3
于 2012-11-11T19:22:20.247 に答える
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>
于 2012-11-11T18:44:17.340 に答える