正确的 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')
我正在解析具有如下结构的页面:
<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')