2013-05-14 4 views
1

Я пытаюсь разобрать дамп XML из Викисловаря, но, вероятно, я чего-то не хватает, так как я ничего не получаю в качестве вывода.Разбор XML-дампа MediaWiki wiki

Это аналогично, но намного короче 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> 

Я интерес в анализе содержания <title> элемента, если <ns> элемент равен 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

+0

Ах, BeautifulSoup имеет тенденцию быть очень медленным при работе с большими файлами - в этом случае вы можете использовать 'lxml'. То, что вы могли бы сделать, это запустить BeautifulSoup поверх XML-анализатора 'lxml' - я обновил свой ответ, чтобы показать, как вы это делаете в конструкторе BeautifulSoup, добавив в качестве второго аргумента' 'xml ''. – jdotjdot

+0

Теперь я получил ошибку 'TypeError: неподдерживаемый тип операндов для +: 'NoneType' и' 'str' с этой строкой: soup = 'BS (open (" itwiktionary-20130507-pages-articles.xml "), "XML") '. Я делаю что-то неправильно? – CptNemo

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

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