2012-03-28 9 views
0

「config-entry」で始まるクラスを持つすべてのdivと一緒にすべてのカテゴリ名を収集する必要があります。私はのようなXPathの//h2[1]/following-sibling::h2[1]/preceding-sibling::div[starts-with(@class,'config-entry')]を使用しています2つのノード間で兄弟を選択

<h2>category 1</h2> 
<div class='clear10'></div> 
<div class='config-entry selected-block'>...</div> 
<div class='config-entry '>...</div> 
<div class='config-entry '>...</div> 
<div class='config-entry '>...</div> 
<h2>category 2</h2> 
<div class='clear10'></div> 
<div class='config-entry selected-block'>...</div> 
<div class='config-entry '>...</div> 
<div class='config-entry '>...</div> 
<div class='config-entry '>...</div> 
<div class='config-entry '>...</div> 
<h2>category 3</h2> 
<div class='clear10'></div> 
<div class='config-entry selected-block'>...</div> 
<div class='config-entry '>...</div> 
<h2>category 4</h2> 
<div class='clear10'></div> 
<div class='config-entry selected-block'>...</div> 
<div class='config-entry '>...</div> 
<div class='config-entry '>...</div> 
<div class='config-entry '>...</div> 

:このコードは、唯一のカテゴリ1のために良い作品

categories = root.xpath("//h2") 
for i in xrange(len(categories)): 
    print "----%s----" % categories[i].text 
    contents = root.xpath("//h2[1]/following-sibling::h2[1]/preceding-sibling::div[starts-with(@class,'config-entry')]") 
    print len(contents) 

は、カテゴリ1と2の間にあるすべてのdivを選択しますが、後のネジアップ。私はh2[1]で遊んだが、0,2,3に変更したが、具体的なものは何もなかった。どんな手掛かり?

答えて

2

私は、文書の順序でそれらを返します。これは、h2タグやdivタグの組合を使用してお勧めしたいとあなたがそれらを処理するときに、それぞれのdivは、あなたが見た最後h2に「所属」。

など。

'//h2|//div[contains(@class,"config-entry")]' 

の作業例:

from lxml import etree 

doc = etree.HTML(""" 
<html> 
<h2>category 1</h2> 
<div class='clear10'></div> 
<div class='config-entry selected-block'>...</div> 
<div class='config-entry '>...</div> 
<div class='config-entry '>...</div> 
<div class='config-entry '>...</div> 
<h2>category 2</h2> 
<div class='clear10'></div> 
<div class='config-entry selected-block'>...</div> 
<div class='config-entry '>...</div> 
<div class='config-entry '>...</div> 
<div class='config-entry '>...</div> 
<div class='config-entry '>...</div> 
<h2>category 3</h2> 
<div class='clear10'></div> 
<div class='config-entry selected-block'>...</div> 
<div class='config-entry '>...</div> 
<h2>category 4</h2> 
<div class='clear10'></div> 
<div class='config-entry selected-block'>...</div> 
<div class='config-entry '>...</div> 
<div class='config-entry '>...</div> 
<div class='config-entry '>...</div> 
</html>""") 

category = None 
for ele in doc.xpath('//h2|//div[contains(@class,"config-entry")]'): 
    if ele.tag == 'h2': 
    category = str(ele.text) 
    else: 
    if category: 
     print "%s: %s, %r" % (category,ele.tag,ele.attrib) 

収量:作業

category 1: div, {'class': 'config-entry selected-block'} 
category 1: div, {'class': 'config-entry '} 
category 1: div, {'class': 'config-entry '} 
category 1: div, {'class': 'config-entry '} 
category 2: div, {'class': 'config-entry selected-block'} 
category 2: div, {'class': 'config-entry '} 
category 2: div, {'class': 'config-entry '} 
category 2: div, {'class': 'config-entry '} 
category 2: div, {'class': 'config-entry '} 
category 3: div, {'class': 'config-entry selected-block'} 
category 3: div, {'class': 'config-entry '} 
category 4: div, {'class': 'config-entry selected-block'} 
category 4: div, {'class': 'config-entry '} 
category 4: div, {'class': 'config-entry '} 
category 4: div, {'class': 'config-entry '} 
+0

1つのザッツ.. – jerrymouse

関連する問題