2016-12-26 7 views
0

Я использую LXML для разбора через большой XML-файл (~ 2 Гб), который содержит статьи и авторов, которые опубликовали их (вроде так):LXML для большого текстового файла, останавливается до конца файла

<article> 
<author>Name 1</author> 
<author>Name 2</author> 
<title> title </title> 
<year> 777 </year> 
<ref> some ref </ref> 
<citi>/here/there<citi> 
</article> 

Что мне нужно сделать, это найти имена авторов, которые содержат определенное слово в теге 'citi', и подсчитать количество раз, когда тег происходит.
(Bascially сосчитать число авторов, которые сделали некоторые работы, связанные с ключевым словом (а также держать счета, сколько раз автор работал с этим ключевым словом))

Существовали две проблемы:
1. Мой XML-файл содержит некоторые внешние объекты, такие как (<author> Name &Oun </author>), и я хотел, чтобы их игнорировали. Я читал онлайн, что по умолчанию lxml не разрешает эти идентификаторы, однако он анализирует все записи, и я просто перехватываю исключение, если оно выбрано.
2. Однако он не анализирует весь файл и не останавливается в определенный момент после выброса исключения.

Я думаю, что это потому, что перед чтением следующего фрагмента исключение исключается, и я не уверен, как этого избежать.

Мой текущий рабочий код заключается в следующем:
(Это просто самодельный код, поэтому я понимаю, что может быть лучше способы сделать несколько шагов, но если вы чувствуете, что можно улучшить, дайте мне знать)

authors=Counter() 
cache_authors=[] 

def parseXMLDOC(): 
    flag=True 
    try: 
     for event, elem in etree.iterparse(self.file): 
     # Keep the current authors in a cache 
     if elem.tag == "author": 
      cache_authors.append(elem.text) 

     # check for keyword 
     if elem.tag=="cite" and flag: 
      # checks if the keyword exists and if it does, it adds 
      # it to authors Counter above 
      flag=not self.checkCitations(elem.text) 

     # clean up for parsing the next article 
     if elem.tag == "article": 
      cache_article=[] 
      flag=True 
     # print event,elem.tag,elem.text 
      elem.clear(); 
    except etree.XMLSyntaxError: 
      print("Unidentified entities encountered") 
+0

Исправьте свой отступ кода –

ответ

1

При работе с такими большими XML-файлами старинный SAX-подход предпочтительнее DOM. В принципе, вы не хотите хранить огромное анализируемое дерево документа в ОЗУ и перемещаться по нему. Скорее, вы реагируете на отдельные события, такие как открытие и закрытие тегов. Например, см. the pyexpat module documentation. Этот подход более эффективен, но более утомителен: вам нужно реализовать (маленький) конечный автомат.

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

  • Нет связанных вопросов^_^