lxml中的xpath根据href查找id号

xpath in lxml to find id number based on href

我正在尝试重写某人的库以解析一些 xml 随请求返回的内容。但是他们以我不习惯的方式使用 lxml 。我相信它使用正则表达式来查找数据,虽然提供的大多数库都可以工作,但当正在解析的站点在列表结构中具有文件 ID 时它不起作用。 Essnetially 我得到了一个页面,我正在寻找一个与 href 运动员号码相匹配的 id。所以说我只想获取运动员 567377 的 ID。

</div>
</a></div>
<ul class='list-entries'>
<li class='entity-details feed-entry' id='Activity-123120999590'>
<div class='avatar avatar-athlete avatar-default'>
<a class='avatar-content' href='/athletes/567377' >
</a>
</div>

</li>
<li class='entity-details feed-entry' id='Activity-16784940202'>
<div class='avatar avatar-athlete avatar-default'>
<a class='avatar-content' href='/athletes/5252525'>
</a>
</div>

代码:

    lst_group_activity = parser.xpath(".//li[substring(@id, 1, 8)='Activity']")

完美地提供所有列表项,但适用于所有活动。我只想拥有与合适的运动员相关的那个。该库使用以下内容来使用@href select 正确的运动员。

    lst_athlethe_act_in_group_activity = parser.xpath(".//li[substring(@id, 1, 8)='Activity']/*[@href='/athletes/"+athlethe_id+"']/..")

然而,这似乎永远行不通。它找到 activity 但随后将它们全部扔掉。

有没有更好的方法让它工作?任何可以为我指出与下一个元素关联的正确方向的教程。

具有 href 属性的元素不是您的 li 元素的直接子元素,因此您的 xpath 失败了。您正在匹配:

.//li/*[@href="..."]

你想要:

.//li/div/a[@href="..."]

(如果您认为另一个元素可能包含 href 属性,您可以匹配 * 而不是 a,如果您认为a 元素的路径可能并不总是 li/div/a).

所以要找到 li 元素:

parser.xpath(".//li[substring(@id, 1, 8)='Activity']/div/a[@href='/athletes/%s']/../.." % '5252525')

但你也可以不带 ../..:

parser.xpath(".//li[substring(@id, 1, 8)='Activity' and div/a/@href='/athletes/%s']" % '5252525')