串联单个XPath查询的多个结果

时间:2018-11-26 16:12:32

标签: php xpath xpath-1.0

给出以下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查询获得以下结果?

  1. Example 1, Example 2

  2. Example 1, Example 2, Example 3


我尝试过:

string(/table/tbody/tr/td//node())

这显然由于以下原因而无效:

  

字符串(对象?)

     

根据内置规则将四种XPath数据类型中的任何一种转换为字符串。如果参数的值是节点集,则该函数将按文档顺序返回第一个节点的字符串值,而忽略任何其他节点。

     

-Wikipedia


编辑

我使用仅支持v1.0的PHP XPath support

XPath查询旨在由用户插入到我正在构建的Web刮板库的配置文件中。

1 个答案:

答案 0 :(得分:1)

在XPath 2.0中,您可以

//tr/string-join(.//a/text(), ", ")

//tr/string(normalize-space(td))

get output

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')]))