使用Python和lxml向上搜索HTML文档

时间:2016-02-25 12:39:16

标签: python html lxml

我有一个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
{
    //...
}

它正确地找到第一个元素,但后来我有一个无限循环。我做错了什么?

1 个答案:

答案 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])