Python 独立性参数:想想,每次查询选择子树时复制它的模型,而不是仅仅返回指向树中该点的指针,效率会低多少@jeckyll2hide,…但是,标准强制功能参数很重要:标准强制要求/引用文档根,而不是上下文项,因此用于引用元素的任何对象都必须包含指向其包含文档的链接。

Python 独立性参数:想想,每次查询选择子树时复制它的模型,而不是仅仅返回指向树中该点的指针,效率会低多少@jeckyll2hide,…但是,标准强制功能参数很重要:标准强制要求/引用文档根,而不是上下文项,因此用于引用元素的任何对象都必须包含指向其包含文档的链接。,python,xpath,lxml,Python,Xpath,Lxml,独立性参数:想想,每次查询选择子树时复制它的模型,而不是仅仅返回指向树中该点的指针,效率会低多少@jeckyll2hide,…但是,标准强制功能参数很重要:标准强制要求/引用文档根,而不是上下文项,因此用于引用元素的任何对象都必须包含指向其包含文档的链接。您对以“/”开头的路径的混淆尽管它与Unix文件命名和URI语法中使用的约定完全相同,但它却非常常见;但在我的代码中,无论何时使用子树行,xpath都不应该有任何方式访问根树,因为行是子树。这是一种常见的编程模式。但我猜行中有一个对嵌入根树的引


独立性参数:想想,每次查询选择子树时复制它的模型,而不是仅仅返回指向树中该点的指针,效率会低多少@jeckyll2hide,…但是,标准强制功能参数很重要:标准强制要求
/
引用文档根,而不是上下文项,因此用于引用元素的任何对象都必须包含指向其包含文档的链接。您对以“/”开头的路径的混淆尽管它与Unix文件命名和URI语法中使用的约定完全相同,但它却非常常见;但在我的代码中,无论何时使用子树
,xpath都不应该有任何方式访问根树,因为行是子树。这是一种常见的编程模式。但我猜
中有一个对嵌入根树的引用,它是在第一次xpath扩展时创建的,这在以xpath开头时并不明显。@jeckyll2hide,它实际上根本不是由任何特定于xpath的东西创建的——元素是DOM模型的一部分,是在文档加载时创建的,在运行第一个XPath查询之前。关于为什么必须遵守相关标准的推理——您还可以运行
foo.xpath('../bar')
——如果元素存在于真空中,这也不会起作用。(底层libxml元素的Python包装器可能会在查询时及时创建,但这是一个实现细节;底层模型需要有到其父级及其文档的链接)。忽略标准的强制功能参数:想想,每次查询选择子树时复制它的模型,而不是只返回指向树中该点的指针,效率会低多少@jeckyll2hide,…但是,标准强制功能参数很重要:标准强制要求
/
引用文档根,而不是上下文项,因此用于引用元素的任何对象都必须包含回其包含文档的链接。
from lxml import etree

sample_html = '''
<body><div><table><tbody>
<tr>
  <th><a href="xxx">AAA</a></th>
  <td data-xxx="AAA-1234"></td>
  <td data-xxx="AAA-5678"></td>
</tr>
<tr>
  <th><a href="xxx">BBB</a></th>
  <td data-xxx="BBB-1234"></td>
  <td data-xxx="BBB-5678"></td>
</tr>
</tbody></table></div></body>
'''

def parse_tree(tree):
    print '============================> Parsing tree'
    rows = tree.xpath('//body/div/table/tbody/tr')
    for row in rows:
        As = row.xpath('//th/a')
        for a in As:
            print a.text
        tds = row.xpath('//td')
        for td in tds:
            print td.attrib['data-xxx']
    print


body = sample_html
tree = etree.HTML(body)
parse_tree(tree)
============================> Parsing tree
AAA
BBB
AAA-1234
AAA-5678
BBB-1234
BBB-5678
AAA
BBB
AAA-1234
AAA-5678
BBB-1234
BBB-5678
============================> Parsing tree
AAA
AAA-1234
AAA-5678
BBB
BBB-1234
BBB-5678
for row in rows:
    As = row.xpath('//th/a')
for row in rows:
    As = row.xpath('.//th/a')