2012-07-01 2 views
0

Это образец XML-документ:извлечение текста из XML-документов в питоне

<bookstore> 
    <book category="COOKING"> 
     <title lang="english">Everyday Italian</title> 
     <author>Giada De Laurentiis</author> 
     <year>2005</year> 
     <price>300.00</price> 
    </book> 

    <book category="CHILDREN"> 
     <title lang="english">Harry Potter</title> 
     <author>J K. Rowling </author> 
     <year>2005</year> 
     <price>625.00</price> 
    </book> 
</bookstore> 

Я хочу, чтобы извлечь текст без указания элементов, как я могу это сделать, потому что у меня есть 10 таких документов. Я хочу, потому что моя проблема в том, что пользователь вводит какое-то слово, которое я не знаю, его нужно искать во всех 10 xml-документах в соответствующих текстовых частях. Чтобы это произошло, я должен знать, где лежит текст, не зная об элементе. Еще одна вещь, что все эти документы разные.

Пожалуйста, помогите !!

ответ

0

Вы можете просто вырезать любые теги:

>>> import re 
>>> txt = """<bookstore> 
...  <book category="COOKING"> 
...   <title lang="english">Everyday Italian</title> 
...   <author>Giada De Laurentiis</author> 
...   <year>2005</year> 
...   <price>300.00</price> 
...  </book> 
... 
...  <book category="CHILDREN"> 
...   <title lang="english">Harry Potter</title> 
...   <author>J K. Rowling </author> 
...   <year>2005</year> 
...   <price>625.00</price> 
...  </book> 
... </bookstore>""" 
>>> exp = re.compile(r'<.*?>') 
>>> text_only = exp.sub('',txt).strip() 
>>> text_only 
'Everyday Italian\n  Giada De Laurentiis\n  2005\n  300.00\n 
    \n\n \n  Harry Potter\n  J K. Rowling \n  2005\n  6 
25.00' 

Но если вы просто хотите, чтобы искать файлы для какой-нибудь текст в Linux, вы можете использовать grep:

[email protected]:~$ grep "Harry Potter" file.xml 
     <title lang="english">Harry Potter</title> 

Если вы хотите найти в файле используйте команду grep или откройте файл и выполните поиск по нему в Python:

>>> import re 
>>> exp = re.compile(r'<.*?>') 
>>> with open('file.xml') as f: 
...  lines = ''.join(line for line in f.readlines()) 
...  text_only = exp.sub('',lines).strip() 
... 
>>> if 'Harry Potter' in text_only: 
... print 'It exists' 
... else: 
... print 'It does not' 
... 
It exists 
+0

Есть ли способ использовать Grep внутри другого файла, хотя я знаю его команда, которая должна быть записана на терминале. Просто знать вообще –

+0

эй его не работает, потому что пример, который вы дали, представляет собой строку xml. что, если мне нужно сделать это в xml-файле с его xml-файла, из которого я должен извлечь, а не из строки xml? –

+0

@POOJAGUPTA Нет, это ищет «Гарри Поттера» внутри файла, который называется «file.xml» ... Строка XML - это результат grep ... –

0

Если вы хотите вызвать grep изнутри python, см. Обсуждение here, особенно this сообщение.

Если вы хотите произвести поиск по всем файлам в директории, которую вы могли бы попробовать что-то вроде этого, используя модуль Глоб:

import glob  
import os  
import re  

p = re.compile('>.*<')  
os.chdir("./")  
for files in glob.glob("*.xml"):  
    file = open(files, "r")  
    line = file.read()  
    list = map(lambda x:x.lstrip('>').rstrip('<'), p.findall(line))  
    print list  
    print 

Этот поиск итерацию через все файлы в каталоге, открывает каждый файл и exteacts текст, соответствующий регулярному выражению.

Выход:

['Everyday Italian', 'Giada De Laurentiis', '2005', '300.00', 'Harry Potter', 'J 
K. Rowling ', '2005', '625.00'] 

EDIT: Обновлен код для извлечения только текстовые элементы из XML.

1

Использование библиотеки LXML с запросом XPATH можно:

xml="""<bookstore> 
    <book category="COOKING"> 
     <title lang="english">Everyday Italian</title> 
     <author>Giada De Laurentiis</author> 
     <year>2005</year> 
     <price>300.00</price> 
    </book> 

    <book category="CHILDREN"> 
     <title lang="english">Harry Potter</title> 
     <author>J K. Rowling </author> 
     <year>2005</year> 
     <price>625.00</price> 
    </book> 
</bookstore> 
""" 
from lxml import etree 
root = etree.fromstring(xml).getroot() 
root.xpath('/bookstore/book/*/text()') 
# ['Everyday Italian', 'Giada De Laurentiis', '2005', '300.00', 'Harry Potter', 'J K. Rowling ', '2005', '625.00'] 

Хотя вы не получите категорию ....

+0

Что делать, если мне нужно сделать этот метод разбора в документе xml, так как ответ, который вы ему дали, это использование строки xml. Ответьте, пожалуйста. –

+1

Хорошо ... мой ответ в том, что ваш комментарий не имеет потрясающего смысла? –

+1

Ваш ** вход ** - это XML. Таким образом, копирование/вставка в виде строки имеет смысл для демонстрационных целей. –

Смежные вопросы