2013-04-08 4 views
0

커다란 xml 파일 (현재 wikipedia dump)이 있습니다. 이 xml 크기는 약 45GB이며 현재 위키 피 디아의 전체 데이터를 나타냅니다.Python을 사용하여 이동 중에 거대한 xml 파일을 구문 분석하는 방법

<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.8/" xmlns:xsi="http://ww 
    w.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/x 
    ml/export-0.8/ http://www.mediawiki.org/xml/export-0.8.xsd" version="0.8" xml:la 
    ng="en"> 
     <siteinfo> 
     <sitename>Wikipedia</sitename> 
     <base>http://en.wikipedia.org/wiki/Main_Page</base> 
     <generator>MediaWiki 1.21wmf6</generator> 
     <case>first-letter</case> 
     <namespaces> 
      <namespace key="-2" case="first-letter">Media</namespace> 
      <namespace key="-1" case="first-letter">Special</namespace> 
      <namespace key="0" case="first-letter" /> 
      <namespace key="1" case="first-letter">Talk</namespace> 
      <namespace key="2" case="first-letter">User</namespace> 
      <namespace key="3" case="first-letter">User talk</namespace> 
      <namespace key="4" case="first-letter">Wikipedia</namespace> 
      <namespace key="5" case="first-letter">Wikipedia talk</namespace> 
      <namespace key="6" case="first-letter">File</namespace> 
      <namespace key="7" case="first-letter">File talk</namespace> 
      <namespace key="8" case="first-letter">MediaWiki</namespace> 
      <namespace key="9" case="first-letter">MediaWiki talk</namespace> 
      <namespace key="10" case="first-letter">Template</namespace> 
      <namespace key="11" case="first-letter">Template talk</namespace> 
      <namespace key="12" case="first-letter">Help</namespace> 
      <namespace key="13" case="first-letter">Help talk</namespace> 
      <namespace key="14" case="first-letter">Category</namespace> 
      <namespace key="15" case="first-letter">Category talk</namespace> 
      <namespace key="100" case="first-letter">Portal</namespace> 
      <namespace key="101" case="first-letter">Portal talk</namespace> 
      <namespace key="108" case="first-letter">Book</namespace> 
      <namespace key="109" case="first-letter">Book talk</namespace> 
      <namespace key="446" case="first-letter">Education Program</namespace> 
      <namespace key="447" case="first-letter">Education Program talk</namespace 
    > 
      <namespace key="710" case="first-letter">TimedText</namespace> 
      <namespace key="711" case="first-letter">TimedText talk</namespace> 
     </namespaces> 
     </siteinfo> 
     <page> 
     <title>AccessibleComputing</title> 
     <ns>0</ns> 
     <id>10</id> 
     <redirect title="Computer accessibility" /> 
     <revision> 
      <id>381202555</id> 
      <parentid>381200179</parentid> 
      <timestamp>2010-08-26T22:38:36Z</timestamp> 
      <contributor> 
      <username>OlEnglish</username> 
      <id>7181920</id> 
      </contributor> 
      <minor /> 
      <comment>[[Help:Reverting|Reverted]] edits by [[Special:Contributions/76.2 
    8.186.133|76.28.186.133]] ([[User talk:76.28.186.133|talk]]) to last version by 
    Gurch</comment> 
      <text xml:space="preserve">#REDIRECT [[Computer accessibility]] {{R from C 
    amelCase}}</text> 
      <sha1>lo15ponaybcg2sf49sstw9gdjmdetnk</sha1> 
      <model>wikitext</model> 

... 그래서 공지 트리의 페이지 요소를

에 : 파일의 처음 몇 줄 (이상 출력)입니다. Wikipedia의 고유 한 페이지에 해당합니다. 주어진 XML은 Wikipedia의 모든 페이지로 페이지 요소 형태로 구성됩니다. 필자는 위키 피 디아의 모든 페이지에 대한 페이지에서 제목 항목의 값을 추출하여 (간단히하기 위해) 인쇄 할 필요가있는 파서를 작성해야합니다.

저는 파이썬을 사용하여 같은 것을 만들려고합니다 (솔루션을 제공하는 언어로 전환 할 수는 있지만). 내가 아는 유일한 방법은 ElementTree입니다.

그러나 parse ('file.xml') 함수를 사용하려면 먼저 전체 문서를 완전히 파싱해야하며 그 다음 결과가 출력됩니다. 분명히, 나는 전체 xml 페이지 요소로 구성되어 알고 있습니다. 나는 프로그램이 나머지 XML을 파싱하는 동안 제목을 인쇄하기를 원한다. 그것도 가능합니다. 그렇다면 어떻게?

EDIT 참고 : 여기에서 제목을 추출하면 문제가 단순하게 유지됩니다. 그러나 나는 미래에 같은 것을 추출해야하기 때문에 xml 파싱 기능이 필요하다.

+2

관련 : http://stackoverflow.com/questions/3707155/can-python-xml-elementtree-parse-a-very-large-xml-file –

답변

3

원하는 것은 전체 문서에 대한 트리를 작성하는 대신 점진적으로 구문 분석 할 때 조각을 보내는 이벤트 기반 XML 라이브러리입니다. 일반적인 답변은 xml.sax stdlib module이지만 많은 사람들이 있다고 확신합니다.

0

물론 가능합니다. 추악한 방법으로 텍스트 모드에서 줄 단위로 파일을 읽을 수 있습니다. 그리고 당신이 제목을 얻고, 당신이 원하는 것을 할 수있는, 그런

<title>AccessibleComputing</title> 

의 형태로 선을 얻기 위해 필터로 정규 표현식 또는 단순한 문자열 검색 방법 (같은 키워드)를 사용합니다.

+0

정규 표현식에와 XML을 구문 분석 함정 엄청나게있다; 특히 Wikipedia의 많은 내용으로, 나는 당신이 그들 중 일부에 참여할 것입니다. –

+0

예. 그래서 이것이 추한 방법입니다.그러나 확실하지는 않지만, 회귀가 더 좋으면 효과가 있다고 생각합니다. 어쨌든 XML은 텍스트 기반입니다. 그러나 당신의 방법이 더 좋습니다. – Sheng

1

큰 데이터 세트를 사용하려고 시도하지 않았지만 lxml module이 빠르고 유용하다는 것을 알았습니다.

lxml.etree 자습서 here은 유용한 예입니다.

핵심 단락은 다음과 같습니다 iterparse에 대한

매우 중요한 사용 사례() 예를 들어, 대형 생성 된 XML 파일을 구문 분석 데이터베이스 덤프. 대부분의 경우 이러한 XML 형식은 루트 노드 바로 아래에 매달려 있으며 수천 번 반복되는 하나의 주 데이터 항목 만 가지고 있습니다. 이 경우 lxml.etree가 트리 생성을 수행하고 데이터 추출을 위해 일반 트리 API를 사용하여이 하나의 Element에서만 정확하게 인터셉트하도록하는 것이 가장 좋습니다.

관련 문제