Получить конкретный текст из XML - PullRequest
0 голосов
/ 20 октября 2019

Hello :) Это моя первая программа на 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 голосов
/ 20 октября 2019

Прежде всего, вам нужно определиться с тем, какой модуль вы собираетесь использовать. lxml или xml? Импортируйте только один из них. lxml имеет больше возможностей, но это внешняя зависимость. xml более простой, но встроенный. Оба модуля имеют много общего API, поэтому их легко спутать. Убедитесь, что вы просматриваете правильную документацию.

Для того, что вы хотите сделать, встроенный модуль достаточно хорош. Однако метод .xpath() здесь не поддерживается, метод, который вы ищете здесь , называется .findall().

Тогда вам нужно помнить, что никогда не анализирует 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...