Python 从XML中获取特定文本

Python 从XML中获取特定文本,python,python-3.x,xml,Python,Python 3.x,Xml,你好:)这是我的第一个python程序,但它不工作 我想做的是: 导入XML文件并仅从中获取Example.swf 第1页 Example.swf (内文) 然后在网站上下载相关文件() 然后将其重命名为1.swf(或第1.swf页) 循环,直到到达页面末尾的最后一个文件(例如aa_idontknow.swf)→ 231.社会福利基金) 将所有文件转换为pdf格式 我所做的(但没有用,因为AttributeError:'xml.etree.ElementTree.Element'对象

你好:)这是我的第一个python程序,但它不工作

我想做的是:

  • 导入XML文件并仅从中获取Example.swf

第1页
Example.swf
(内文)
  • 然后在网站上下载相关文件()
  • 然后将其重命名为1.swf(或第1.swf页)

  • 循环,直到到达页面末尾的最后一个文件(例如aa_idontknow.swf)→ 231.社会福利基金)

  • 将所有文件转换为pdf格式

我所做的(但没有用,因为AttributeError:'xml.etree.ElementTree.Element'对象没有属性'xpath'):

重新导入
导入urllib.request
导入请求
导入时间
导入请求
导入lxml
导入lxml.html
导入操作系统
从xml.etree导入ElementTree作为ET
DIR=“C:/Users/mypath…”
对于os.listdir(DIR)中的文件名:
如果filename.endswith(“.xml”):
打开(file=DIR+“.xml”,mode='r',encoding='utf-8')作为文件:
_tree=ET.fromstring(text=file.read())
_所有_元数据_标记=_tree.xpath('.//向量_文件')
对于i-in\u-all\u元数据\u标记:
打印(i.text+“\n”)
其他:
打印(“跳过文件名”)

首先,您需要决定要使用什么模块
lxml
xml
?只导入其中一个
lxml
有更多的特性,但它是一个外部依赖项
xml
更基本,但它是内置的。这两个模块共享很多API,因此很容易混淆。检查您正在查看的文档是否正确

对于您想要做的事情,内置模块已经足够好了。但是,此处不支持
.xpath()
方法,即您在此处查找的方法

然后您需要记住,永远不要解析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')
如果每个文件只需要一个
元素,或者只需要第一个这样的元素,请使用
.find()
而不是
.findall()


您可以使用
glob
处理通配符并仅获取匹配文件的列表:谢谢,它可以工作,但现在我想下载它们并逐个重命名(page1.swf、page2.swf、page3.swf)?我该怎么做?无论如何,非常感谢您通过谷歌搜索“如何用Python重命名文件”:
vector_file = tree.find('.//vector_file')

if vector_file is None:
    print('Nothing found')
else:
    print(vector_file.text + '\n')