0

私のデータベースには、次のような値があります。

<p class="description">Text here
    <a href=#>Text here</a>
</p>

そして、テンプレートファイルで<p>同じオブジェクトを置き換えるには、そのオブジェクト全体が必要です。<p class="description>

import sys
from HTMLParser import HTMLParser
from xml.etree import cElementTree as etree
import psycopg2
import psycopg2.extras

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()

conn = psycopg2.connect(dbname="**", user="**", password="**", host="/tmp/", port="**")
cur.execute("SELECT * FROM landingpagedata;")
row = cur.fetchone()
template = 'template.html'

parser = LinksParser()

parser.feed(open(template).read())
root = parser.close()

#p_class_description
p = root.find(".//p[@class='description']")
p.text = str(row['p_class_description'])
f = open(row['new_html_page'], 'w')
root.write(f)
parser = LinksParser()

ファイルで最終的に得られるのは次のとおりです。

<p class="suggested_readings">&lt;p class="suggested_readings"&gt;Text here &lt;a href=#;"&gt;Text here &lt;/a&gt;.&lt;/p&gt;
 <a href=#>Text from template</a> and more from template</p>

要素全体をこの要素に置き換えることはできないようです。または、データベースに実際の要素を保存しようとする必要がありますか? ここではとても無力です。

ありがとう!!!

4

1 に答える 1

1

lxmlを使用してこの問題を解決しました。だから今、トップはこれらを使用しています:

import sys
from lxml import etree
from StringIO import StringIO
import psycopg2
import psycopg2.extras

実装は次のようになります。

for row in rows:
  parser = etree.HTMLParser()
  root = etree.parse(template)

  p_class_aboutmaterials = root.find(".//p[@class='about_materials']")
  div_class_aboutmaterials = p_class_aboutmaterials.getparent()
  div_class_aboutmaterials.remove(p_class_aboutmaterials)
  div_class_aboutmaterials.append(etree.XML(row['p_class_aboutmaterials']))

私はそれを文字列に変換していたので、エスケープされたhtmlを持つ運命にありました。ここでは、XML 要素として渡します。Getparent() と remove() を使用すると、テンプレートに既に含まれているコンテンツを置き換えることができます。

于 2013-05-15T15:37:00.593 に答える