2016-04-10 3 views
0

Bir xml dosyası ayrıştırmam gerekiyor, bu da benim durumum için en iyi yöntem. beautifulsoup4, ElementTree, vb. oldukça büyük bir dosya. Ben Pencereleri 10 64bit çalışan piton var 2.7.11 32bitPython ayrıştırma xml dosyası

xml dosyası: http://pastebin.com/jTDRwCZr

Ben kullanarak farklı diller içeren dosya xml bu çıktıyı almaya çalışıyorum "div xml: lang =" İngilizce " " ingilizce için. Bunu başarmak için lxml ile beautifulsoup'i nasıl kullanabileceğime dair herhangi bir yardım? zaman ayırdığın için teşekkürler.

<tt xmlns="http://www.w3.org/2006/04/ttaf1"  xmlns:tts="http://www.w3.org/2006/04/ttaf1#styling"> 
<head> 
<styling> 
<style id="1" tts:textOutline='#000000 2px 2px' tts:color="white"/> 
</styling> 
</head> 
<body> 
<div xml:lang="English"> 
<p begin="00:00:28.966" end="00:00:31.385" style="1"> 
text text text... 
</p> 
</div> 
</body> 
</tt> 
+1

lxml ile BeautifulSoup neredeyse hiçbir zaman kötü bir seçim değildir. – Borealid

+0

Ne istediğinizi net değil. Sadece ingilizce dil almayı ve başka dilleri görmezden gelmeye mi çalışıyorsun? – mhawke

+0

@mhawke evet, tam olarak ne olduğunu açıklamak için özür dilemeye çalışıyorum. sadece ingilizce dil almayı denemek ve geri kalanını görmezden gelmek. – Yami

cevap

1

Bağladığınız dosya, ayrıştırma ve işleme için alternatif yöntemler konusunda endişelenmeniz gereken o kadar büyük değil. soup.find_all() Yukarıdaki kodda

from bs4 import BeautifulSoup 

with open('input.xml') as infile: 
    soup = BeautifulSoup(infile, 'lxml') 
    for e in soup.find_all('div', attrs={'xml:lang': lambda value: value != 'English'}): 
     _ = e.extract() 

with open('output.xml', 'w') as outfile: 
    outfile.write(soup.prettify(soup.original_encoding)) 

bir olan bir xml:lang özelliğine sahip tüm div s bulur:

Eğer BeautifulSoup ile yapabilirsiniz olmayan tüm İngilizce dil div s kaldırmaya çalışırken varsayarsak 'English''dan başka değer. Daha sonra eşleşen öğeleri extract() ile kaldırır. Son olarak, ortaya çıkan belge girişle aynı kodlamayı kullanarak yeni bir dosyaya yazılır (aksi takdirde UTF-8 için varsayılan değer olacaktır).

+0

hmm Ben ingilizce div ' – Yami

+0

bile kaldırıldı garip çıktı dosyası var Üzgünüm ben son yorumumu iyi açıklanmadı. Yukarıdaki kod harika çalışıyor! Ancak bazı nedenlerden dolayı ikinci xml dosyamda denedim. her şeyi kaldırdı. Diğer xml dosyasıyla aynı biçimlendirmedir, tek farkın var olması bu konuda daha fazla dil olmasıdır. https://codeshare.io/8KhNE Ayrıca, bs4'ün ne yaptığı konusunda bana çok teşekkür etti. – Yami

+0

@ xNightmare67x: Yukarıdaki kodu diğer dosyanızda denedim ve beklediğim gibi çalıştı, yani 'div' leri 'xml: lang' ile' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ile kaldırdı ve oradaki İngilizceyi bıraktı. – mhawke

0

Genellikle DOM yaklaşımı hızlı ve kullanımı kolaydır (10 MB'ye kadar). Ancak, gerçekten büyük xml dosyasıysa (> 50 MB), XML DOM yaklaşımı tüm XML nesnesini belleğe ayrıştırdığından kullanılamaz. Sadece 100 MB'a kadar veriyi ayrıştırmak için 3-4 GB RAM alır ve önemli ölçüde yavaşlar. Yani başka bir seçenek, XML dosyalarının yinelemeli veya olaya dayalı ayrıştırma yapmak olacaktır. Yinelemeli ayrıştırma için elementTree veya lxml yaklaşımları kullanılabilir. Genellikle elementTree oldukça yavaştır, bu yüzden cElementTree, benzer API'yi kullanmanızı öneririm ancak C öğesinde elementTree'den önemli ölçüde daha hızlıdır. Son zamanlarda,> 100 MB büyüklükte XML dosyaları ayrıştırmak için elementTree kullanıyorum ve şimdiye kadar benim için çok iyi çalışıyor! Lxml'den emin değilim. XML ayrıştırma API'lerinin nasıl kullanılacağı hakkında daha fazla bilgi için çevrimiçi olarak göz atardım.