【问题标题】:Php Dom - Sum specific column in tablePhp Dom - 对表中的特定列求和
【发布时间】:2018-09-15 19:32:31
【问题描述】:

我无法使用 Dom Document 和 Xpath 计算特定列。

源文件如下所示:

    already some other tables and then...

        <table><hr><tr><td><table>
<td align="center" colspan="1"><u><b>Contracts</b></u></td>
<tr><th>pos</th><th>player</th><th>age</th><th>year 1</th><th>year 2</th><th>year 3</th><th>year 4</th><th>year 5</th><th>year 6</th></tr>
<tr><td CLASS=tdp>PG</td><td CLASS=tdp><a href="JamesHarden7.htm">James Harden                    </a></td><td>27</td><td>20.00</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td CLASS=tdp>PG</td><td CLASS=tdp><a href="TerryRozier1.htm">Terry Rozier                    </a></td><td>22</td><td>1.10</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td CLASS=tdp>SG</td><td CLASS=tdp><a href="DannyGreen6.htm">Danny Green                     </a></td><td>29</td><td>2.60</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td CLASS=tdp>SG</td><td CLASS=tdp><a href="MarcoBelinelli3.htm">Marco Belinelli                 </a></td><td>30</td><td>1.50</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td CLASS=tdp>SF</td><td CLASS=tdp><a href="LuolDeng12.htm">Luol Deng                       </a></td><td>31</td><td>1.75</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td CLASS=tdp>SF</td><td CLASS=tdp><a href="JeremyEvans9.htm">Jeremy Evans                    </a></td><td>28</td><td>7.50</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td CLASS=tdp>PF</td><td CLASS=tdp><a href="JeffWithey8.htm">Jeff Withey                     </a></td><td>26</td><td>6.25</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td CLASS=tdp>PF</td><td CLASS=tdp><a href="LavoyAllen11.htm">Lavoy Allen                     </a></td><td>27</td><td>1.50</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td CLASS=tdp> C</td><td CLASS=tdp><a href="JonasValanciunas10.htm">Jonas Valanciunas               </a></td><td>24</td><td>12.75</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td CLASS=tdp> C</td><td CLASS=tdp><a href="RyanHollins4.htm">Ryan Hollins                    </a></td><td>31</td><td>1.50</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td CLASS=tdp>SF</td><td CLASS=tdp><a href="K.J.McDaniels2.htm">K.J. McDaniels                  </a></td><td>23</td><td>1.50</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td CLASS=tdp>PG</td><td CLASS=tdp><a href="BrianteWeber5.htm">Briante Weber                   </a></td><td>24</td><td>4.35</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td CLASS=tdp>SF</td><td CLASS=tdp><a href="NicolasBrussino13.htm">Nicolas Brussino                </a></td><td>23</td><td>1.00</td><td></td><td></td><td></td><td></td><td></td></tr>
</table></td><td><table>
    ...

我使用此代码,类似于我在这里找到的代码,但结果总是“0”。

$doc = new DOMDocument;
$doc->loadHTML('URL');

$xpath = new DOMXPath($doc);

// sum of cells of the sixth table (contracts), in the fourth column (year1), skipping the first row (ignore Year 1)
print $xpath->evaluate('sum(//table[6]//tr[position() > 1]/td[4])');

【问题讨论】:

    标签: php xml dom xpath html-table


    【解决方案1】:

    在 XPath 中使用像 table[6] 这样的术语可能会很困难,因为这非常依赖于整个文档结构。如果您可以将&lt;b&gt;Contracts&lt;/b&gt; 之类的内容作为您感兴趣的表格的一部分并搜索该表格,那就更好了。

    所以你可以试试……

    print $xpath->evaluate('sum(//table[td/u/b/.="Contracts"]/tr[position() > 1]/td[4])');
    

    更新:

    为了帮助弄清楚它在做什么,您可以将其分解为多个级别并查看它的返回值。要检查它是否正在查找表,请使用...

    $table = $xpath->query('//table[td/u/b="Contracts"]');
    echo $doc->saveHTML($table[0]);
    

    然后添加到它以查看它失败的地方。最大的困难之一可能是,当您使用 HTML 时,经常会出现糟糕的 HTML 被转换为 XML 的问题,并且它可能会失去一些结构。

    【讨论】:

    • 感谢您的意见。它还不适合我。搜索到的表位于另一个表标签内是否重要?或者它可能是数字格式?例如数字是 20.00。
    • 使用// 的意思是在任何级别上都可以找到它,所以它在另一个表中的事实并不重要。我还用你提供的 HTML 片段试了一下,结果是 63.3,所以数字格式似乎没问题。
    • 我添加了一些额外的代码,可能有助于了解正在发生的事情。
    • 非常感谢。我现在可以总结列。但现在只有 1 个问题: 警告:DOMDocument::loadHTMLFile(): Unexpected end tag : pre in URL - 源文件中实际上有一个
      -tag。有没有办法忽略这个错误?
    • 我自己可能已经找到了解决方案。我用 '@$doc->loadHTMLFile($file)' 抑制了警告。
    猜你喜欢
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    相关资源
    最近更新 更多