Я использую 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")
Исправьте свой отступ кода –