Выход из амперсанда и других специальных символов в XML с использованием Python - PullRequest
0 голосов
/ 16 февраля 2020

Мне нужно проанализировать большое количество XML файлов и записать их в текстовый файл. Однако некоторые файлы XML содержат специальные / недопустимые символы. Я пытался использовать различные методы, такие как Escaping Strings для использования в XML, но я не мог заставить его работать. Я знаю 1 способ решить эту проблему - отредактировать сам файл XML, но есть тысячи файлов.

import os
from xml.etree import ElementTree
from xml.sax.saxutils import escape

fileNum = 0;
saveFile = open('NewYork_1.txt','w')

for path, dirs, files in os.walk("NewYork_1"):
   for f in files:
      fileName = os.path.join(path, f)
      with open(fileName,'r', encoding='utf-8') as myFile:
        # print(myFile.read())
        if "&" in myFile:
            myFile = myFile.replace("&", "&") #This does not work.

Кроме того, некоторые из файлов XML также содержат Unicode. Есть смайлики.

<Thread>
   <ThreadID></ThreadID>
   <Title></Title>
   <InitPost>
      <UserID></UserID>
      <Date></Date>
      <icontent></icontent>
   </InitPost>
   <Post>
      <UserID></UserID>
      <Date></Date>
      <rcontent></rcontent>
  </Post>
</Thread>

Ответы [ 3 ]

1 голос
/ 16 февраля 2020

Еще одна вещь ...

Вы можете использовать BeautifulSoup, чтобы просто найти части файла xml, из которого вы извлекаете данные. Пошаговая обработка по мере необходимости, а не загрузка всего файла в переменную с последующей итерацией элемента за элементом.

Например:

Если в файле xml есть теги, такие как:

<pos reviews>
<review_id>001<review_id>
<reviewer_name>John Stamos (From full house)</reviewer_name>
<review_text>This is a great item</review_text>

Вы можете просто beautifulsoup.findAll (любой тег) и просто получить эти данные. Я не знаю, что вы делаете конкретно, хотя. Я подумал, что стоит предложить.

1 голос
/ 16 февраля 2020

Попробуйте это:

import os
from xml.etree import ElementTree
from xml.sax.saxutils import escape

fileNum = 0;
saveFile = open('NewYork_1.txt','w')
saveFile.close()
for path, dirs, files in os.walk("NewYork_1"):
   for f in files:
       fileName = os.path.join(path, f)
       with open(fileName,'a', encoding='utf-8') as myFile:
           myFile=myFile.read()
           if "&" in myFile:
                myFile = myFile.replace("&", "&#38;")

Лично я бы сгенерировал список файлов для чтения и перебора этого списка, а не использовал бы os.walk (если вы получаете список из предыдущей функции или отдельным сценарием, вы всегда можете создать текстовый файл с каждым txt-файлом на отдельной строке и выполнять итерацию по строкам, вместо того, чтобы получать переменную для сохранения оперативной памяти), но для каждого свой.

Как я уже сказал, хотя Я бы отказался от всей идеи замены специальных символов и использовал бы bs4 для открытия файлов, поиска элементов, которые вы ищете, и извлечения их оттуда.

import bs4
list_of_USER_IDs=[]
with open(fileName,'r', encoding='utf-8') as myFile:
    a=myFile.read()
    b=bs4.beautifulSoup(a)
    for elem in b.findAll('USERID'):
        list_of_USER_IDs.append(elem)

Это возвращает данные между Теги USERID, но они будут работать для любого тега, с которого вы хотите получить данные. Нет необходимости напрямую разбирать xml. Это действительно не сильно отличается от HTML, и BeautifulSoup создан для этого, так зачем изобретать велосипед?

0 голосов
/ 16 февраля 2020

Что вы можете сделать, это прочитать файл в виде строки.

file_str = open("xml_file.xml", "r+")

Затем использовать функцию fromString , равную xml .etree.ElementTree

tree = xml.etree.ElementTree.fromString(file_str)

Затем поработайте с ним.

root = tree.getRoot()

Таким образом, вам не нужно беспокоиться о написании кода для каждого смайлика и недопустимого знака. Если вы хотите написать смайлики и специальные символы utf-8 для xml, вам нужно добавить эту строку вверху.

 <?xml version="1.0" encoding="utf-8" ?>
...