Python 获取元素的最小XPath
我试图创建一个函数,返回元素的XPATH。不幸的是,它返回的是绝对xpath,这是不够的 我希望得到尽可能最小的xpath(或者更好——更“聪明”,不一定是最小的)。例如,如果元素具有id,则返回xpath取决于其id 我想多次使用这个xpath,根据页面更改,绝对xpath非常容易受到攻击 或者,如果它的父级具有id,则通过id返回父级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
/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,但仍然有比绝对路径更好的“锚”。