正确的 xpath 来汇总 children 的文本

proper xpath to roll up text of children

我正在解析具有如下结构的页面:

<pre class="asdf">content a</pre>
<pre class="asdf">content b</pre>

# returns
content a
content b

我正在使用以下 XPath 获取内容: "//pre[@class='asdf']/text()"

它运行良好,除非在 <pre> 标记内嵌套了任何元素,但它不会将它们连接起来:

<pre class="asdf">content <a href="http://whosebug.com"</a>a</a></pre>
<pre class="asdf">content b</pre>

# returns
content
content b

如果我使用这个 XPath,我会得到下面的输出。 "//pre[@class='asdf']//text()"

content
a
content b

我一个都不想要。我想在 <pre> 中获取所有文本,即使它有 children。我不在乎标签是否被剥离 - 但我希望它连接在一起。

我该怎么做?我在 python2 中使用 lxml.html.xpath,但我认为这无关紧要。 This answer to another question 让我觉得 child:: 可能与我的回答有关。

这里有一些重现它的代码。

from lxml import html

tree = html.fromstring("""
<pre class="asdf">content <a href="http://whosebug.com">a</a></pre>
<pre class="asdf">content b</pre>
""")
for row in tree.xpath("//*[@class='asdf']/text()"):
  print("row: ", row)

.text_content() 是你应该使用的:

.text_content(): Returns the text content of the element, including the text content of its children, with no markup.

for row in tree.xpath("//*[@class='asdf']"):
    print("row: ", row.text_content())

演示:

>>> from lxml import html
>>> 
>>> tree = html.fromstring("""
... <pre class="asdf">content <a href="http://whosebug.com">a</a></pre>
... <pre class="asdf">content b</pre>
... """)
>>> for row in tree.xpath("//*[@class='asdf']"):
...     print("row: ", row.text_content())
... 
('row: ', 'content a')
('row: ', 'content b')