从XML抓取特定文本

时间:2019-10-20 07:50:44

标签: python python-3.x xml

您好:)这是我的第一个python程序,但是它不起作用。

我想做什么:

  • 导入XML文件,仅从
  • 抓取Example.swf
<page id="Example">
<info>
<title>page 1</title>
</info>
<vector_file>Example.swf</vector_file>
</page>
(the text inside <vector_file>) 
  • 比将相关文件下载到网站(https://website.com/.../.../Example.swf
  • 将其重命名为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")

1 个答案:

答案 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')