我有一个HTML文档,其结构如下:
geometry.getAttribute("uv")
我需要找到所有父 a 元素,位于 li 元素,并使用 name =为 a 元素构建路径3 即可。在此示例中,它应为 a1 / a2 。我使用lxml编写了这个Python代码:
// src/AppBundle/Entity/Product.php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="AppBundle\Entity\ProductRepository")
*/
class Product
{
//...
}
它正确地找到第一个元素,但后来我有一个无限循环。我做错了什么?
答案 0 :(得分:0)
你的while循环首先遍历祖先li
并获得后代a[1]
。然后从当前a
开始,在下一个循环中,您的XPath将再次遍历同一个li
祖先并返回相同的a
元素,这将永远持续下去(添加print current
验证。我在同一个内存位置看到Element
,这意味着它们是同一个实例,反复打印。
您可以尝试从目标a[@name="%s"]
向上移动树状字符串,然后反向加入收集的路径步骤:
def get_path_for_series(self, html, series):
current = html.xpath('//a[@name="%s"]' % series)[0]
path = list()
parent = current.xpath('parent::li')
while parent:
a = parent[0].xpath('a[1]')[0]
path.append(a.text)
parent = parent[0].xpath('parent::li')
# join `path` in reversed order
return '/'.join(path[::-1])