给出以下HTML表:
<table>
<tbody>
<tr>
<td>
<a href="">Example 1</a>
,
<a href="">Example 2</a>
</td>
</tr>
<tr>
<td>
<a href="">Example 1</a>
,
<a href="">Example 2</a>
,
<a href="">Example 3</a>
</td>
</tr>
<!-- ... -->
<!-- Variable amount of rows with variable amount of anchor texts -->
<!-- ... -->
</tbody>
</table>
是否可以通过单个 XPath查询获得以下结果?
Example 1, Example 2
Example 1, Example 2, Example 3
我尝试过:
string(/table/tbody/tr/td//node())
这显然由于以下原因而无效:
字符串(对象?)
根据内置规则将四种XPath数据类型中的任何一种转换为字符串。如果参数的值是节点集,则该函数将按文档顺序返回第一个节点的字符串值,而忽略任何其他节点。
-Wikipedia
编辑
我使用仅支持v1.0的PHP XPath support。
XPath查询旨在由用户插入到我正在构建的Web刮板库的配置文件中。
答案 0 :(得分:1)
在XPath 2.0中,您可以
//tr/string-join(.//a/text(), ", ")
或
//tr/string(normalize-space(td))
Example 1, Example 2
Example 1, Example 2, Example 3
您还可以使用编程语言libs / features获取输出(如果需要XPath 1.0解决方案)。例如,使用Python lxml.html
for tr in source.xpath('//tr'):
print(', '.join([a.text for a in tr.xpath('./td/a')]))