您好:)这是我的第一个python程序,但是它不起作用。
我想做什么:
<page id="Example">
<info>
<title>page 1</title>
</info>
<vector_file>Example.swf</vector_file>
</page>
(the text inside <vector_file>)
将其重命名为1.swf(或第1.swf页)
并循环播放,直到到达页面末尾的最后一个文件(Exampleaa_idontknow.swf→231.swf)
转换所有pdf文件
我做了什么(但没用,因为AttributeError:'xml.etree.ElementTree.Element'对象没有属性'xpath'):
import re
import urllib.request
import requests
import time
import requests
import lxml
import lxml.html
import os
from xml.etree import ElementTree as ET
DIR="C:/Users/mypath.../"
for filename in os.listdir(DIR):
if filename.endswith(".xml"):
with open(file=DIR+".xml",mode='r',encoding='utf-8') as file:
_tree = ET.fromstring(text=file.read())
_all_metadata_tags = _tree.xpath('.//vector_file')
for i in _all_metadata_tags:
print(i.text + '\n')
else:
print("skipping for filename")
答案 0 :(得分:0)
首先,您需要确定要使用的模块。 lxml
还是xml
?仅导入其中之一。 lxml
具有更多功能,但这是一个外部依赖性。 xml
是更基本的,但它是内置的。这两个模块共享许多API,因此很容易混淆。检查您是否在寻找正确的文档。
对于您想要做的事情,内置模块已经足够了。但是,此处不支持.xpath()
方法,is called .findall()
是您在这里寻找的方法。
然后,您需要记住永远不要通过将XML文件打开为纯文本文件来解析XML文件,将其读入字符串并解析该字符串。这不仅浪费,而且从根本上来说是错误的事情。 XML解析器具有内置的自动编码检测功能。这种机制可确保您不必担心文件编码,但也必须使用。
这不仅更好,而且编写的代码更少:使用ET.parse()
并传递文件名。
import os
from xml.etree import ElementTree as ET
DIR = r'C:\Users\mypath'
for filename in os.listdir(DIR):
if not filename.lower().endswith(".xml"):
print("skipping for filename")
continue
fullname = os.path.join(DIR, filename)
tree = ET.parse(fullname)
for vector_file in tree.findall('.//vector_file'):
print(vector_file.text + '\n')
如果每个文件只希望有一个<vector_file>
元素,或者只关心第一个这样的元素,请使用.find()
而不是.findall()
:
vector_file = tree.find('.//vector_file')
if vector_file is None:
print('Nothing found')
else:
print(vector_file.text + '\n')