![](/img/trans.png)
[英]How do I save an Element Tree to a list based on an attribute in a child tag using Python's LXML module?
[英]Using Element.tree how do I parse a tag within a tag?
我是编码新手,我正在尝试从此条目中解析以下字段:
名称、类别、风险、成员
我似乎编写了代码来获取 3/4 字段,但由于某种原因,当我尝试从“成员”字段中获取文本时,我收到一条错误消息,请告诉我我做错了什么,我是新手,所以如果你有一种更简单的方法可以接受建议。
<application>
<entry id="120" name="100bao" ori_country="USA" ori_language="English">
<category>general-internet</category>
<subcategory>file-sharing</subcategory>
<technology>peer-to-peer</technology>
<evasive-behavior>yes</evasive-behavior>
<consume-big-bandwidth>yes</consume-big-bandwidth>
<used-by-malware>yes</used-by-malware>
<able-to-transfer-file>yes</able-to-transfer-file>
<has-known-vulnerability>yes</has-known-vulnerability>
<tunnel-other-application>no</tunnel-other-application>
<prone-to-misuse>yes</prone-to-misuse>
<pervasive-use>yes</pervasive-use>
<risk>5</risk>
<references>
<entry name="www.100bao.com">
<link>http://www.100bao.com/</link>
</entry>
</references>
<per-direction-regex>no</per-direction-regex>
<appident>yes</appident>
<default>
<port>
<member>tcp/3468,6346,11300</member>
</port>
</default>
</entry>
import xml.etree.ElementTree as ET
mytree = ET.parse('C:/Documents/Parse Folder/apps.xml')
root = mytree.getroot()
for entry in root.findall('entry'):
category = entry.find('category').text
risk = entry.find('risk').text
member = entry.find('member').text
print(entry.attrib, category, risk, member)
member = entry.find('member').text
AttributeError: 'NoneType' object has no attribute 'text'
这是因为member
不是entry
的孩子,所以你需要提供一个XPath 。
member = entry.find('./default/port/member').text
(未经测试,因为您问题中的代码按原样无法测试。)
更新了经过测试的代码
apps.xml (更新为格式正确)
<application>
<entry id="120" name="100bao" ori_country="USA" ori_language="English">
<category>general-internet</category>
<subcategory>file-sharing</subcategory>
<technology>peer-to-peer</technology>
<evasive-behavior>yes</evasive-behavior>
<consume-big-bandwidth>yes</consume-big-bandwidth>
<used-by-malware>yes</used-by-malware>
<able-to-transfer-file>yes</able-to-transfer-file>
<has-known-vulnerability>yes</has-known-vulnerability>
<tunnel-other-application>no</tunnel-other-application>
<prone-to-misuse>yes</prone-to-misuse>
<pervasive-use>yes</pervasive-use>
<risk>5</risk>
<references>
<entry name="www.100bao.com">
<link>http://www.100bao.com/</link>
</entry>
</references>
<per-direction-regex>no</per-direction-regex>
<appident>yes</appident>
<default>
<port>
<member>tcp/3468,6346,11300</member>
</port>
</default>
</entry>
</application>
Python
import xml.etree.ElementTree as ET
mytree = ET.parse('apps.xml')
root = mytree.getroot()
for entry in root.findall('entry'):
name = entry.get('name')
category = entry.find('category').text
risk = entry.find('risk').text
member = entry.find('default/port/member').text
print(f'Name: "{name}"\nCategory: "{category}"\nRisk: "{risk}"\nMember: "{member}"')
Output
Name: "100bao"
Category: "general-internet"
Risk: "5"
Member: "tcp/3468,6346,11300"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.