2011-05-04 29 views
13

Olası Çoğalt: Ne HTML tables bulmak için BeautifulSoup kullanıyorum
Beautiful Soup cannot find a CSS class if the object has other classes, tooBeautifulSoup ve Arama By Sınıf

. Şu anda karşılaştığım sorun, class özniteliğinde boşluk kullanımıdır. Bu tablo halinde bulacaksınız

BeautifulSoup(html).findAll(attrs={'class':re.compile("wikitable(sortable)?")}) 

: my HTML <html><table class="wikitable sortable">blah</table></html> yazıyorsa (I class hem wikipedia ve wikipedia sortable ile tables bulmak mümkün olacaktı nerede), ben aşağıdaki ile bunu ayıklamak gibi olamaz HTML'm yine de <html><table class="wikitable">blah</table></html>. Benzer şekilde, normal ifademde "wikitable sortable" kullanmayı denedim ve bu da eşleşmeyecek. Herhangi bir fikir?

cevap

24

wikitableclass="something wikitable other" de olduğu gibi diğer CSS dersten sonra görünürse desen maçı da başarısız olur, böylece kimin class özelliğinin sınıfını wikitable içerdiği tüm tabloları istiyorsanız, daha fazla olanak kabul eden bir desen gerekir:

html = '''<html><table class="sortable wikitable other">blah</table> 
<table class="wikitable sortable">blah</table> 
<table class="wikitable"><blah></table></html>''' 

tree = BeautifulSoup(html) 
for node in tree.findAll(attrs={'class': re.compile(r".*\bwikitable\b.*")}): 
    print node 

Sonuç:


<table class="sortable wikitable other">blah</table> 
<table class="wikitable sortable">blah</table> 
<table class="wikitable"><blah></blah></table> 
Sadece kayıt için, ben BeautifulSoup kullanın vekullanmayı tercih yok, diğerlerinin de belirttiği gibi. BeautifulSoup daha lxml iyi yapan şeylerden

+2

Bir güncelleme gibi, BeautifulSoup'un (bs4) en son sürümü, daha zarif bir şekilde ele alır: http://www.crummy.com/software/BeautifulSoup/bs4/doc/#searching-by-css-class – Eli

8

Bir düzgün CSS benzeri sınıf seçimi için destek (hatta bunları kullanmak istiyorsanız full css selectors destekler)

import lxml.html 

html = """<html> 
<body> 
<div class="bread butter"></div> 
<div class="bread"></div> 
</body> 
</html>""" 

tree = lxml.html.fromstring(html) 

elements = tree.find_class("bread") 

for element in elements: 
    print lxml.html.tostring(element) 

verir:

<div class="bread butter"></div> 
<div class="bread"></div> 
+0

+1 Bu, @allie'nin BeautifulSoup kodunu yazmasına yardımcı olmaz lxml çok üstün. – Henry

+0

Bunun zerafetini takdir etsem de, BeautifulSoup zaten burada olan şeydir ve şu an için kullanmam gereken şey budur. :) –