Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取元素的最小XPath_Python_Html_Python 2.7_Xpath_Web Scraping - Fatal编程技术网

Python 获取元素的最小XPath

Python 获取元素的最小XPath,python,html,python-2.7,xpath,web-scraping,Python,Html,Python 2.7,Xpath,Web Scraping,我试图创建一个函数,返回元素的XPATH。不幸的是,它返回的是绝对xpath,这是不够的 我希望得到尽可能最小的xpath(或者更好——更“聪明”,不一定是最小的)。例如,如果元素具有id,则返回xpath取决于其id 我想多次使用这个xpath,根据页面更改,绝对xpath非常容易受到攻击 或者,如果它的父级具有id,则通过id返回父级xpath,并使用/child返回concat 是否可以使用lxml模块或其他模块 例如,XPath助手向导扩展可以做得更好 def _load_root(ur

我试图创建一个函数,返回元素的XPATH。不幸的是,它返回的是绝对xpath,这是不够的

我希望得到尽可能最小的xpath(或者更好——更“聪明”,不一定是最小的)。例如,如果元素具有id,则返回xpath取决于其id

我想多次使用这个xpath,根据页面更改,绝对xpath非常容易受到攻击

或者,如果它的父级具有id,则通过id返回父级xpath,并使用
/child
返回concat

是否可以使用
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/body/div[1]/div[1]/div[2]/div[1]/div[2]/div[1]/div[2]/div[1]/div/div[1]/div[2]/div[2]/div[1]/div[1]/table/tr[6]/td[2]/div[1]


你知道怎么做吗?

据我所知,你要求的是两个相互矛盾的东西:一个最小的XPath,一个对文档的更改保持稳定的XPath

元素的最小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() + "]"
} 

谢谢你的回答,迈克尔。我发现一个术语“最小路径”最接近我想要实现的目标。您的答案解决了ID的问题,但还有更多的情况。例如,非常常见的是class=“price”或itemprop=“price”等。因此我不能只依赖ID(这是最好的选择),因为很多时候没有ID,但仍然有比绝对路径更好的“锚”。