3

私のログを見て、Postgres から返された行が文字列から要素に変換されていることを確認してください (そして、文字列を出力し、要素を出力し、isElement ブール値を出力します!) 試してみると、それを追加するには、エラーはそれが要素ではないということです。ふふ、ふふ。

import sys
from HTMLParser import HTMLParser
from xml.etree import cElementTree as etree
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import Element, SubElement, tostring
import psycopg2
import psycopg2.extras

def main():
    # Connect to an existing database
    conn = psycopg2.connect(dbname="**", user="**", password="**", host="/tmp/", port="**")

    # Open a cursor to perform database operations
    cur = conn.cursor(cursor_factory = psycopg2.extras.RealDictCursor)

    cur.execute("SELECT * FROM landingpagedata;")
    rows = cur.fetchall()

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

    template = 'template.html'



    # parser.feed(open('landingIndex.html').read()) #for testing
    # root = parser.close()

    for row in rows:
        parser = LinksParser()

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




        #title
        title = root.find(".//title")
        title.text = row['title']

        #headline
        h1_id_headline = root.find(".//h1")
        h1_id_headline.text = row['h1_id_headline']
        # print row['h1_id_headline']

        #intro
        p_class_intro = root.find(".//p[@class='intro']")
        p_class_intro.text = row['p_class_intro']
        # print row['p_class_intro']

ここで問題が発生します!

        #recommended
        p_class_recommendedbackground = root.find(".//div[@class='recommended_background_div']")
        print p_class_recommendedbackground
        p_class_recommendedbackground.clear()
        newElement = ET.fromstring(row['p_class_recommendedbackground'])
        print row['p_class_recommendedbackground']
        print ET.iselement(newElement)
        p_class_recommendedbackground.append(newElement)

        html = tostring(root)
        f = open(row['page_name'], 'w').close()
        f = open(row['page_name'], 'w')
        f.write(html)
        f.close()
        # f = ''
        # html = ''
        parser.reset()
        root = ''

    # Close communication with the database
    cur.close()
    conn.close()

if __name__ == "__main__":
  main()

私のログはこれです:

{background: url(/images/courses/azRealEstate.png) center no-repeat;}
<Element 'div' at 0x10a999720>
<p class="recommended_background">Materials are are aimed to all aspiring real estate sales associates who wish to obtain the Arizona Real Estate Salesperson license, which is provided by the <a href="http://www.re.state.az.us/" style="text-decoration: underline;">Arizona Department of Real Estate</a>.</p>
True
Traceback (most recent call last):
  File "/Users/Morgan13/Programming/LandingPageBuilder/landingPages/landingBuilderTest.py", line 108, in <module> main()
  File "/Users/Morgan13/Programming/LandingPageBuilder/landingPages/landingBuilderTest.py", line 84, in main
    p_class_recommendedbackground.append(newElement)
TypeError: must be Element, not Element
[Finished in 0.1s with exit code 1]
4

1 に答える 1

1

この方法でエラー メッセージを再現できます。

from xml.etree import cElementTree as etree
import xml.etree.ElementTree as ET

croot = etree.Element('root')
child = ET.Element('child')
croot.append(child)
# TypeError: must be Element, not Element

この問題の根本的な原因は、 のcElementTree実装ElementTreeと の実装を混在させていることxml.etree.ElementTreeですElementTree。双子が会うべきではありません。

したがって、修正は単に 1 つを選択し、たとえば を選択し、他の出現箇所をすべて置き換える (たとえば、でetree置き換える) だけです。ETetree

于 2013-05-09T17:41:14.080 に答える