我正在阅读带有以下演示的lxml教程:
#+BEGIN_SRC ipython :session lxml :results output
print(html.xpath("string()")) # lxml.etree only!
# TEXTTAIL
print(html.xpath("//text()")) # lxml.etree only!
# ['TEXT', 'TAIL']
#+END_SRC
#+RESULTS:
: TEXTTAIL
: ['TEXT', 'TAIL']
我对//
中的html.xpath("//text()"
感到困惑
如果将其删除,则会返回一个空列表。
#+begin_src ipython :session lxml :results output
print(html.xpath("text()"))
#+end_src
#+RESULTS:
: []
答案 0 :(得分:1)
//是/ descendant-or-self :: node()/的缩写。例如,// para是 / descendant-or-self :: node()/ child :: para的缩写,因此将选择 文档中的任何para元素(甚至是 由于document元素将由// para选择document元素 node是根节点的子节点); div // para的缩写 div / descendant-or-self :: node()/ child :: para,因此将选择所有para div孩子的后代。
因此//text()
等效于/descendant-or-self::node()/child::text()
,它将选择文档中的所有文本节点。
删除//
时,只会选择当前上下文的子节点(无论html
是什么)。