我正在编写一些使用Python Element.find()
模块中的xml.etree.ElementTree
方法的代码。但是,我发现只要我开始使用str.replace()
,Python就会将我对object.find()
的调用解释为str.find()
而不是Element.find()
。
我需要我的代码从XML文件中的各种Element
对象中获取文本,在某些情况下,我需要使用str
方法对其进行修改。如何在不改变解释器解释object.find()
的方式的情况下执行此操作?这是我的代码:
import xml.etree.ElementTree as xml
import re
import json
pattern = re.compile('[a-z,0-9,-]+')
c_pattern = re.compile('\[caption[^\]]+\]')
c2_pattern = re.compile('\[/caption\]')
tree = xml.parse('file.xml')
root = tree.getroot()
for item in root.iter('item'):
if item.find('{http://wordpress.org/export/1.2/}post_type').text == 'post':
t = item.find('{http://purl.org/rss/1.0/modules/content/}encoded').text
print item.find
try:
t = t.encode('utf-8')
o_cap = re.findall(c_pattern,t)
e_cap = re.findall(c2_pattern,t)
for item in o_cap:
t = t.replace(item,'')
for item in e_cap:
t = t.replace(item,'')
except:
t = 'None'
print item.find
title = item.find('title').text
第一个print
语句返回<bound method Element.find of <Element 'item' at 0x2a7a7d0>>
,而第二个返回<built-in method find of str object at 0x2b56e00>
。
我已经尝试了子类化Element
,但我不知道如何使我的XML文件中的Element
节点成为新子类的对象。我也试过简单地定义一个引用Element.find()
方法的新方法,但是当我尝试使用它时,解释器只是告诉我一个Element
对象没有名称的方法用户定义的。
我想到的另一种方式是某种
from xml.etree.ElementTree import Element.find() as Element.some_other_name()
但这不起作用(我尝试了一堆语法变体,但它们也不起作用)。有谁知道我可以/应该做些什么来解决这个问题?
答案 0 :(得分:5)
你正在破坏名称item
。尝试将内部循环中的变量名称切换为其他名称,例如poop
。
for poop in o_cap:
t = t.replace(poop,'')
for poop in e_cap:
t = alvin.replace(poop,'')
答案 1 :(得分:2)
没有任何代码,我只能猜测。
被调用的方法总是来自您所指的对象。如果您希望Element.find()
运行,则必须拥有Element
个对象。相反,您有一个str
对象,来自replace()
。
另一种方法是将Element
的内容替换为replace()
结果,然后才能将其作为原始内容进行处理。