2016-02-25 56 views
0

我有這樣一個結構的HTML文檔:搜索和LXML向上

<html> 
    <li> 
    <a href="" />a1</a> 
    <other tags ... /> 
    <li> 
     <a href="">a2</a> 
     <another one tag ... /> 
     <a name=3> 
    </li> 
    </li> 
    <li> 
    ... 
    </li> 

我需要找到所有父一個元素,位於undert 元素爲a元素建立路徑name = 3。在這個例子中,它應該是a1/a2。我使用LXML寫了這樣的Python代碼:

import lxml 
... 

def get_path_for_series(self, html, series): 
    current = html.xpath('//a[@name="%s"]' % series)[0] 
    path = list() 
    while True: 
     category = current.xpath('.//ancestor::li[1]//a[1]') 
     if len(category) == 0: 
      break 
     path.append(self.clear(category[0].text_content())) 
     current = category[0] 
    return '/'.join(path) 

它正確地找到的第一個元素,但後來我甲肝的infinate循環。我做錯了什麼?

回答

0

你的while循環首先遍歷祖先li並得到子代a[1]。然後從當前的a,在下一個循環中,XPath將再次遍歷到相同的li祖先,並返回相同的a元素,並且這會永遠持續下去(添加print current來驗證,我在同一內存位置看到了Element,這意味着它們是同一個實例,一遍又一遍地打印)。

你可以嘗試向上樹從目標a[@name="%s"]代替statring,並加入到收集路徑步驟相反,像這樣:

def get_path_for_series(self, html, series): 
    current = html.xpath('//a[@name="%s"]' % series)[0] 
    path = list() 
    parent = current.xpath('parent::li') 

    while parent: 
     a = parent[0].xpath('a[1]')[0] 
     path.append(a.text) 
     parent = parent[0].xpath('parent::li') 

    # join `path` in reversed order 
    return '/'.join(path[::-1])