2013-04-28 19 views
3

我有以下的html:LXML/Python的:把以前的同胞

<div id = "big"> 
    <span>header 1</span> 
    <ul id = "outer"> 
     <li id = "inner">aaa</li> 
     <li id = "inner">bbb</li> 
    </ul> 

    <span>header 2</span> 
    <ul id = "outer"> 
     <li id = "inner">ccc</li> 
     <li id = "inner">ddd</li> 
    </ul> 
</div> 

我希望它環路其順序爲:

header 1 
aaa 
bbb 
header 2 
ccc 
ddd 

我曾試圖通過每個UL,然後循環打印標題和li值。但是,我不知道如何獲得與ul關聯的span標頭。

sets = tree.xpath("//div[@id='big']//ul[@id='outer']") 

for set in sets: 

    # Print header. Not sure how to get it 
    header = set.xpath(".//li/preceding-sibling::span") 
    print header 

    # Print texts. This works. 
    values = set.xpath(".//li//text()") 
    for v in values: 
     print v 

只循環所有文本節點將無法正常工作,因爲我需要知道它是否是標題或li值。

+0

不直接影響問題,但這是錯誤的HTML,因爲ID應該是唯一的。你可以用'class =「outer」'代替。 – 2015-01-12 11:53:53

回答

6

這工作:

header = ingred_set.getprevious().xpath(".//text()")[0] 
0

對於HTML使用BeautifulSoup。它給你access to previous and next siblings直接:

sibling_soup.b.next_sibling 
# <c>text2</c> 

sibling_soup.c.previous_sibling 
# <b>text1</b> 

此外,你可以告訴BS使用lxml解析器constructor。從實踐中我可以看出,lxml在格式錯誤的輸入上執行比缺省html.parser更好

+0

我不再是beautifulSoup的粉絲。它比lxml慢,我一直遇到問題和限制。 – user984003 2013-04-28 13:03:14

+1

我其實從來沒有碰到任何BS的嚴重限制。出於好奇,你能舉一些例子嗎? – 2013-04-28 13:57:39