2015-05-13 3 views
0

Примечание. Я нахожусь в Windows 7, 64-разрядной системе - только что установленный cygwin.Извлечение данных между тегами из огромных текстовых (XML) файлов

Мне нужно извлечь большие объемы данных из большого количества больших (100 МБ) XML-файлов. Файлы XML содержат кучу последовательностей линий, выглядит следующим образом:

<taggie> 
lotsolines which include some string that I'm searching for. 
</taggie> 

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

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

filename, start line (begin tag), end line (end tag) 
bogusname.xml, 50025, 100003 

Тогда я еще один поиск, чтобы создать список, где происходят мои строки. Это может показаться чем-то вроде этого.

filename, searchstring, line number 
bogusname.xml, "foo", 76543 

Затем я обрабатываю этот второй список против первого списка, чтобы извлечь информацию (возможно, во второй огромный файл или, возможно, в набор файлов. Мне все равно, на данный момент.

Во всяком случае, это происходит со мной, когда я делаю это, что кто-то почти наверняка сделал эту точную вещь или что-то очень похожее на нее.

Итак, может ли кто-нибудь направить меня на код, который уже делает это? Python предпочитает, но unix для сценария для cygwin было бы удобно. Я предпочитаю исходный код для любого исполняемого файла, где я не вижу, что делает источник.

Между тем, я продолжаю самостоятельно. Заранее спасибо.

Для точных данных, я загрузив этот файл (например): http://storage.googleapis.com/patents/grant_full_text/2015/ipg150106.zip Я распаковать его, и я хочу, чтобы извлечь эти документы XML, которые содержат любые из большого количества строк поиска. Это один файл с тысячами конкатенированных XML-документов. Я хочу извлечь любой XML, содержащий одну из строк поиска.

Я экспериментировал с BeautifulSoup на данный момент:

from __future__ import print_function 
from bs4 import BeautifulSoup # To get everything 
import urllib2 

xml_handle = open("t.xml", "r") 
soup = BeautifulSoup(xml_handle) 

i = 0 
for grant in soup('us-patent-grant'): 
    i = i + 1 
    print (i) 
    print (grant) 

print (i) 

Когда я делаю это, она дает окончательное значение я из 9. Если получали ВСЮ «мы-патентно-гранта ', я ожидал бы, что у меня будет больше 6000, что указывает на то, что он не может анализировать весь файл.

ответ

1

(в прошлом ответ)

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

f = open("filename.xml") 
xml = f.read() 
soup = BeautifulSoup(xml) 
find_search = re.compile("[search]+") 
#remain code here.... 

проверки этого сайта http://www.crummy.com/software/BeautifulSoup/bs4/doc/ для BeautifulSoup, и https://docs.python.org/2/library/re.html для регулярной грамматики выражений.

, но вы можете легко сделать то, что хотите после посещения этой веб-страницы.

=============================================================================================================================================== ===================================

Файл слишком велик, поэтому вам нужны коды для разделения файлов на отдельные файлы. Из ссылки Split diary file into multiple files using Python, вы можете написать код, как

<!-- language: python --> 
def files(): 
    n = 0 
    while True: 
     n += 1 
     yield open('xml_%d.xml' % n, 'w') 
pat = '<?xml' 
fs = files() 
outfile = next(fs) 
with open("ipg150106.xml") as infile: 
    for line in infile: 
     if pat not in line: 
      outfile.write(line) 
     else: 
      items = line.split(pat) 
      outfile.write(items[0]) 
      for item in items[1:]: 
       outfile = next(fs) 
       outfile.write(pat + item) 

Этот код дает мне xml_6527.xml.

def files(): 
    n = 0 
    while True: 
     n += 1 
     yield open('xml_%d.xml' % n, 'w') 

if __name__ == '__main__': 
    #make file seperate 
    # pat = '<?xml' 
    # fs = files() 
    # outfile = next(fs) 

    # with open("ipg150106.xml") as infile: 
    #  for line in infile: 
    #   if pat not in line: 
    #    outfile.write(line) 
    #   else: 
    #    items = line.split(pat) 
    #    outfile.write(items[0]) 
    #    for item in items[1:]: 
    #     outfile = next(fs) 
    #     outfile.write(pat + item) 

    #analyzing each file 
    import os 
    pwd = os.path.dirname(os.path.realpath(__file__)) 
    xml_files = [xml_file for xml_file in os.listdir(pwd) if os.path.isfile(os.path.join(pwd, xml_file))] 

    for f in xml_files: 
     xml = f.read() 
     soup = BeautifulSoup(xml) 
     #Remain code here.. 

(извините за странный блок кода :()

+0

Я смотрю на это прямо сейчас. Проблема у меня с ним в том, что каждый из этих огромных файлов содержат тысячи сцепленных документов XML - и я не уверен, но я думаю, что BS только читает первый. Просматривая документы сейчас. – elbillaf

+0

@elbillaf Я однажды перечислил одну страницу группы facebook около 50000 сообщений, включая комментарии, но beautifulsoup сломал ее и проанализировал ее в 10 секунд на моем 4GB RAM macbook. Кроме того, я предлагаю, что относительно разделения конкатенированных XML-документов? –

+0

Я не знаю, что вы предлагаете. – elbillaf