鍍金池/ 問(wèn)答/Python  網(wǎng)絡(luò)安全/ lxml etree ElementUnicodeResult類(lèi)的getpare

lxml etree ElementUnicodeResult類(lèi)的getparent()獲取到的是前一個(gè)節(jié)點(diǎn),而不是父節(jié)點(diǎn)

html數(shù)據(jù)

<p class="para">
    如果可選的第三個(gè)參數(shù)
    <code class="parameter">strict</code>
    為
    <strong>
        <code>TRUE</code>
    </strong>
    ,則
    <span class="function">
        <strong>array_search()</strong>
    </span> 
    將在
    <code class="parameter">haystack</code>
    中檢查
    <em class="emphasis">完全相同</em>的元素。這意味著同樣嚴(yán)格比較
    <code class="parameter">haystack</code> 里
    <code class="parameter">needle</code> 的
    <a href="language.types.php" class="link">類(lèi)型</a>
    ,并且對(duì)象需是同一個(gè)實(shí)例。
</p>

方法

def get_code(self, node, active=False):
    c = ''
    if isinstance(node, etree._ElementUnicodeResult):
        c = str(node).replace('\n', '').replace(' ', '').strip()
        p = node.getparent()
        print(p.tag + ' : ' + str(p.attrib) +'  | content: '+ c)
        return c
    if isinstance(node, etree._Element):
        for item in node.xpath('node()'):
            c += str(get_code(item, active))
        return c

使用上面的方法遞歸讀取每個(gè)節(jié)點(diǎn)的文本內(nèi)容,xpath('node()')匹配文本為lxml.etree.ElementUnicodeResult對(duì)象,節(jié)點(diǎn)為lxml.etree.Element對(duì)象。

混合排版的文本ElementUnicodeResult對(duì)象getparent()不能正確獲取父節(jié)點(diǎn),前面有兄弟節(jié)點(diǎn)時(shí)getparent()獲取到的時(shí)前邊的兄弟節(jié)點(diǎn)。比如文本 ,則 將在 中檢查 都是獲取到文字前邊的的節(jié)點(diǎn)

前邊方法的輸出

p : {'class': 'para'}  content: 如果可選的第三個(gè)參數(shù)
code : {'class': 'parameter'}  content: strict
code : {'class': 'parameter'}  content: 為
code : {}  content: TRUE
strong : {}  content: ,則
strong : {}  content: array_search()
span : {'class': 'function'}  content: 將在
code : {'class': 'parameter'}  content: haystack
code : {'class': 'parameter'}  content: 中檢查
em : {'class': 'emphasis'}  content: 完全相同
em : {'class': 'emphasis'}  content: 的元素。這意味著同樣嚴(yán)格比較
code : {'class': 'parameter'}  content: haystack
code : {'class': 'parameter'}  content: 里
code : {'class': 'parameter'}  content: needle
code : {'class': 'parameter'}  content: 的
a : {'href': 'http://php.net/manual/zh/language.types.php', 'class': 'link'}  content: 類(lèi)型
a : {'href': 'http://php.net/manual/zh/language.types.php', 'class': 'link'}  content: ,并且對(duì)象需是同一個(gè)實(shí)例。

這個(gè)如何解決。

我的目的是根據(jù)他的父節(jié)點(diǎn)的標(biāo)簽 判斷文字是粗體 還是斜體
期待結(jié)果應(yīng)該為

如果可選的第三個(gè)參數(shù)`strict` 為 **`TRUE`**,則**array_searck**中檢查*完全相同*的元素。這意味著同樣嚴(yán)格比較`haystack`里`needle`的類(lèi)型,并且對(duì)象需是同一個(gè)實(shí)例。
回答
編輯回答
陌顏

審核時(shí)間好長(zhǎng)?。。?!
搜索一圈沒(méi)找到解決。臨時(shí)解決方法傳入父節(jié)點(diǎn),遞歸每層深度的父節(jié)點(diǎn)是一樣的

def get_code(self, node, parent=None, active=False):
    if parent is None:
        parent = node.getparent()
    c = ''
    if isinstance(node, etree._ElementUnicodeResult):
        c = str(node).replace('\n', '').replace(' ', '').strip()
        p = parent
        print(p.tag + ' : ' + str(p.attrib) +'  | content: '+ c)
        return c
    if isinstance(node, etree._Element):
        for item in node.xpath('node()'):
            c += str(get_code(item,node,active=active))
        return c
2017年1月25日 04:01