2013-07-25 24 views
7

BeautifulSoup ile html belgelerinden bazı metinler almaya çalışıyorum. Benim için çok nazik bir durumda, bu garip ve ilginç bir sonuç ortaya çıkarır: belirli bir noktadan sonra, çorba metin içinde fazladan boşluklarla doludur (bir alan aşağıdakilerden her harfi ayırır). Bunun için bir neden bulmak için web'de arama yapmaya çalıştım, ancak karşıdaki hata hakkında sadece bazı haberlerle karşılaştım (hiç boşluk yok). BeautifulSoup beklenmedik fazladan boşluk döndürüyor

bazı önerim var veya bu olur neden ipucu mı ve nasıl bu sorunu çözmek için ?.

Bu i yarattı çok temel kodudur:

from bs4 import BeautifulSoup 

import urllib2 
html = urllib2.urlopen("http://www.beppegrillo.it") 
prova = html.read() 
soup = BeautifulSoup(prova) 
print soup 

Ve bu, bu sorunun görünmeye başlar sonuçlarından alınan bir çizgi, çizgi:

değeri = \" Giuseppe LABBATE ogm? olmayan vorremmo nuovi uccelli chiamati lontre \ "> < giriş onmouseover = \" Uç (' < cen terclass = \ \ 'başlık _ Video \ \' > <b> G iuseppelabbateo g m? o n o n v o r r e m a y u v u C C l l I c h i m t, i l o n tr e <

+2

Neden ultrasoup 'yazıyorsunuz? Çorba olmamalı mı? – svineet

+0

Aynı sorun başka bir web sitesiyle burada. Hala bunun, BeautifulSoup ya da temeldeki lxml ile ilgili bir sorun olup olmadığını anlamaya çalışıyorum. Yazılım 32bit-Python üzerinde sorunsuz çalışıyor ve 64bit ile başarısız oluyor. – Matthias

+0

'Ultrasoup' için özür dilerim, küçük bir hata. Tabii ki, doğru kod 'baskı çorba' oldu –

cevap

10

Bu LXML HTML ayrıştırıcı bir hata olduğunu düşünüyoruz. Dene:

from bs4 import BeautifulSoup 

import urllib2 
html = urllib2.urlopen ("http://www.beppegrillo.it") 
prova = html.read() 
soup = BeautifulSoup(prova.replace('ISO-8859-1', 'utf-8')) 
print soup 

soruna geçici bir çözüm değildir. Sorunun lxml 3.0 alpha 2 ve lxml 2.3.6'da çözüldüğüne inanıyorum, bu yüzden daha yeni bir sürüme yükseltmeniz gerekip gerekmediğini kontrol etmek faydalı olabilir. vericiyi fazla bilgi istiyorsanız

başlangıçta burada açılmıştı: Bu yardımcı olur

https://bugs.launchpad.net/beautifulsoup/+bug/972466

Umut,

Hayden

Sen html.parser olarak ayrıştırıcı belirtebilirsiniz
+0

Bu mükemmel çalışıyor, teşekkürler.Bu durumda ne değiştirmenin yerini sorabilir miyim? Başka bir soru: beautifulsoup her zaman lxml html ayrıştırıcısını benimser mi? Eğer değilse, neden kullanıyorum ve hangi ayrıştırıcıyı benimsemeyi nasıl kontrol edebilirim? Bence bunlar kukla sorular olarak görünebilir, ama ben –

+0

@ Hayden: Ugly, ama çalışan bir çözüm ayrıştırma html yeni başlayan biriyim. Bunun için teşekkürler. – Matthias

4

:

Ayrıca,
soup = BeautifulSoup(prova, 'html.parser') 

Ayrıca Eğer html5 ayrıştırıcı belirtebilirsiniz:

henüz html5 ayrıştırıcı yüklü mı

soup = BeautifulSoup(prova, 'html5') 
? terminalden kurun:

sudo apt-get install python-html5lib 

xml ayrıştırıcı kullanılabilir (soup = BeautifulSoup(prova, 'xml')) ancak class="foo bar" gibi multi-valued attributes bazı farklılıklar görebilirsiniz.