2012-07-29 26 views
2

我有些标记,我使用lxml的处理数据选择多个元素类型。当我打开一个文件,我不知道该文件被打开之前,如果我有一个或一个以上三种类型的元素的(我能有什么类型我有一个,两个或三个不同的元素和多个实例)更Python的方式从标记数据

我需要了解的是被包含在这种情况下,我有三个类型,但仅在每个类型的一个元素

<element_type_1> 
     <name>joe smith</name> 
</element_type_1> 
<element_type_2> 
     <name>mary smith</name> 
</element_type_2> 
<element_type_3> 
     <name>patrick smith</name> 
</element_type_3> 

那么的子标签,这些元素的一些信息。然而,可能有多达一些随意性较大数量的任何类型的。

我在我的功能

def get_types(myTree): 
    type_dict=defaultdict(list) 
    type_dict['type_1']=myTree.cssselect('element_type_1') 
    type_dict['type_2']=myTree.cssselect('element_type_2') 
    type_dict['type_3']=myTree.cssselect('element_type_3') 
    ret type_dict 

这似乎过于冗余

我失去的东西,会收拾这个有点用cssselect 3次获得的元素?

仅供参考,我这样做是因为每种类型的我不得不从相关文件

早期的答案,建议我要澄清一点符合其他一些数据 - 我想避免通过树三次

运行
+0

你有使用csselect?否则,带有'contains('element_type _')'的XPath表达式可能会更好地实现这个技巧? (见http://stackoverflow.com/questions/11106971/how-to-search-for-content-in-xpath-in-multiline-text-using-python) – Qiau 2012-07-29 21:23:56

回答

5

你可以这样做:

for i in range(1, 4): 
    type_dict['type_%d' % i] = myTree.cssselect('element_type_%d' % i) 
1

取决于如果你知道它的外观。使用变量作为关键字可能是一件简单的事情,可以帮助您改进一点。

def get_types(myTree): 
    type_dict=defaultdict(list) 
    for i in range(1,4): 
     x = 'type_%d' % i 
     y = 'element_type_%d' % i 
     type_dict[x] = myTree.csselect(y) 
    return type_dict 
0

或者你可以遍历一组已知的标签查找匹配的元素。当你找到一个元素时,添加(标签,值)到字典。应该可以工作。

1

我完全不知道你是如何识别这些“类型”,如果你不事先知道他们的名字。他们是否遵循一些可以搜索的固定模式?

例如,你可以这样做:

d = {} 
typeelements = "*[starts-with(local-name(), 'element_type_')]" 
for e in myTree.xpath(typeelements) 
    typename = e.tag.split('_',1)[1] 
    d[typename] = e 

或者更简洁地说:

d = {e.tag.split('_',1)[1]:e for e in myTree.xpath(typeelements)} 

或者,您也可以选择基于元素本身的一些标准的元素。 IUN你的榜样,他们都name孩子,所以你可以使用这样的路径:

typeelements = '*[name]' 

,也可混合两种要求:

typeelements = "*[starts-with(name(), 'element_type_')][name]" 
相关问题