2016-12-29 7 views
4

要素のXPATHを返す関数を作成しようとしています。残念ながら、それは十分ではない絶対xpathを返します。要素の最小XPathを取得

可能な限り最小限のxpathを取得したい(または、より良い "賢い"、必ずしも最小限ではない)。たとえば、elementにidがある場合、return xpathはそのidに依存します。

私はこのxpathを複数回使用したいと思います。絶対パスxpathはページの変更によって非常に脆弱です。

親がidを持つ場合は、idで親のxpathを返し、/childと連結します。

lxmlモジュールまたは別のモジュールで可能ですか?

たとえば、XPathヘルパーウィザード拡張子でこれを行うことができます。

def _load_root(url): 
    r = requests.get(url) 
    r.encoding = 'utf-8' 
    html = r.content 
    return etree.fromstring(html, etree.HTMLParser()) 

def get_xpath_by_text(text,url): 
    root = _load_root(url) 
    e = root.xpath('.//*[contains(text(),"{}")]'.format(text)) 
    print root.getpath(e) 

/HTML /本体/ DIV [1]/DIV [1]/DIV [1]/DIV [2]/DIV [1]/DIV [1]/DIV [2]/DIV/div [2]/div [1]/div [1]/div/div [1]/div [2]/div [ 2]/div [1]

あなたはその方法を知っていますか?

答えて

1

最小限のXPathとドキュメントの変更に対して安定したXPathという2つの矛盾したことを私は見ています。

要素の最小XPathは通常(//*)[134]のようなものですが、これはドキュメントの変更に非常に敏感です。あなたが好きな再帰アルゴリズムを使用して、ID()属性に最も近い祖先へのXPath相対を得ることができます

function minimalXpath(Node node) { 
    if (exists(node/@id)) 
    then "id(" + node/@id + ")" 
    else if (node is root) 
    then "" 
    else minimalXPath(node.getParent()) + "/" + node.getName() + 
    "[" + node.getSiblingPosition() + "]" 
} 
+0

は答えをあなたにマイケルをありがとうございました。私は、達成したいことに最も近いものとして、「最小限のパス」という用語を見つけました。あなたの答えはIDの問題を解決しますが、はるかに多くの状況があります。例えば、class = "price"やitemprop = "price"などのように非常に一般的です。したがって、IDには何も依存しません(これは最良のオプションです)。パス。 –

関連する問題