2013-05-14 65 views
1

我想解析一下維基教科書的XML轉儲,但可能我錯過了一些東西,因爲我沒有得到任何輸出。解析MediaWiki wiki的XML轉儲

這是一個類似但更短的xml文件:

<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.8/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.8/ http://www.mediawiki.org/xml/export-0.8.xsd" version="0.8" xml:lang="it">  
<page> 
    <title>bigoto</title> 
    <ns>0</ns> 
    <id>24840</id> 
    <revision> 
     <id>1171207</id> 
     <parentid>743817</parentid> 
     <timestamp>2011-12-18T19:26:42Z</timestamp> 
     <contributor> 
     <username>GnuBotmarcoo</username> 
     <id>14353</id> 
     </contributor> 
     <minor /> 
     <comment>[[Wikizionario:Bot|Bot]]: Sostituisco template {{[[Template:in|in]]}}</comment> 
     <text xml:space="preserve">== wikimarkups ==</text> 
     <sha1>gji6wqnsy6vi1ro8887t3bikh7nb3fr</sha1> 
     <model>wikitext</model> 
     <format>text/x-wiki</format> 
    </revision> 
</page> 
</mediawiki> 

我在,如果<ns>元素等於解析<title>元素的內容感興趣0

這是我的腳本

import xml.etree.ElementTree as ET 
tree = ET.parse('test.xml') 
root = tree.getroot() 

for page in root.findall('page'): 
    ns = int(page.find('ns').text) 
    word = page.find('title').text 
    if ns == 0: 
     print word 

回答

1

我推薦使用BeautifulSoup你可以在f或類似的東西,因爲它使用起來非常簡單。

from bs4 import BeautifulSoup as BS 
# given your html as the variable 'html' 
soup = BS(html, "xml") 
pages = soup.find_all('page') 
for page in pages: 
    if page.ns.text == '0': 
     print page.title.text 

至於我可以告訴在這裏,沒有必要使用int<ns>標籤轉換爲整數來比較== 0。在這種情況下,與字符串'0'進行比較的工作同樣簡單 - 因爲您根本不必處理轉換。

+0

這適用於小型XML文件。但是當我解析長(128mb)xml轉儲文件時,腳本崩潰......或者列表中我認爲崩潰了,因爲它在兩個多小時後沒有完成任務。有沒有什麼策略讓它處理非常大的文件? – CptNemo 2013-05-14 10:30:36

+0

啊,BeautifulSoup在使用大文件時的速度往往非常慢 - 在這種情況下,您可能需要使用'lxml'。你可以在「lxml」XML解析器的頂部運行BeautifulSoup - 我已經更新了我的迴應,以顯示在BeautifulSoup構造函數中如何實現,並添加了「xml」作爲第二個參數。 – jdotjdot 2013-05-14 12:30:07

+0

現在,我得到錯誤:TypeError:不支持的操作數類型爲+:'NoneType'和''str':'='BS(open(「itwiktionary-20130507-pages-articles.xml」)) 「XML」)'。難道我做錯了什麼? – CptNemo 2013-05-14 22:46:18