php - DOMDocument/Xpath-如何从表中获取特定行

标签 php xpath

这是表dom的输出:

<table cellspacing="0" cellpadding="0">
    <tbody>
        <tr>
            <th>Валута</th>
            <th>Код</th>
            <th>За единица<br />валута</th>
            <th>Фиксинг на БНБ</th>
            <th>Курс купува</th>
            <th>Курс продава</th>
        </tr>
        <tr>
    <td>Австралийски долар</td>
    <td><em>AUD</em></td>
    <td align="center">1</td>
    <td>1.328960</td>
    <td>1.29340</td>
    <td>1.35670</td>
</tr><tr>
    <td>Британска лира</td>
    <td><em>GBP</em></td>
    <td align="center">1</td>
    <td>2.325380</td>
    <td>2.26920</td>
    <td>2.37970</td>
</tr><tr>
    <td>Евро</td>
    <td><em>EUR</em></td>
    <td align="center">1</td>
    <td>1.955830</td>
    <td>1.94900</td>
    <td>1.95850</td>
</tr><tr>
    <td>Канадски долар</td>
    <td><em>CAD</em></td>
    <td align="center">1</td>
    <td>1.354830</td>
    <td>1.32380</td>
    <td>1.38890</td>
</tr><tr>
    <td>Швейцарски франк</td>
    <td><em>CHF</em></td>
    <td align="center">1</td>
    <td>1.800950</td>
    <td>1.75730</td>
    <td>1.84140</td>
</tr><tr>
    <td>Щатски долар</td>
    <td><em>USD</em></td>
    <td align="center">1</td>
    <td>1.775770</td>
    <td>1.73710</td>
    <td>1.81010</td>
</tr><tr>
    <td>Японска йена</td>
    <td><em>JPY</em></td>
    <td align="center">100</td>
    <td>1.673650</td>
    <td>1.63180</td>
    <td>1.71330</td>
</tr><tr>
    <td>Датска крона</td>
    <td><em>DKK</em></td>
    <td align="center">10</td>
    <td>2.629160</td>
    <td>2.56400</td>
    <td>2.69070</td>
</tr><tr>
    <td>Норвежка крона</td>
    <td><em>NOK</em></td>
    <td align="center">10</td>
    <td>2.084060</td>
    <td>2.03290</td>
    <td>2.13250</td>
</tr><tr>
    <td>Шведска крона</td>
    <td><em>SEK</em></td>
    <td align="center">10</td>
    <td>2.059220</td>
    <td>2.00700</td>
    <td>2.10550</td>
</tr><tr>
    <td>Руска рубла</td>
    <td><em>RUB</em></td>
    <td align="center">100</td>
    <td>2.751570</td>
    <td>2.42030</td>
    <td>3.11320</td>
</tr><tr>
    <td>Нова румънска лея</td>
    <td><em>RON</em></td>
    <td align="center">10</td>
    <td>4.384380</td>
    <td>4.17110</td>
    <td>4.61270</td>
</tr>
    </tbody>
</table>


我很高兴只得到带有<em>GBP</em>和最后一个<td></td>文本的行。
我不需要的所有其他东西。

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
    require_once('app/Mage.php');
    Mage::app();

    $url = 'https://www.fibank.bg/bg/valutni-kursove/page/461';


    $curl = curl_init();
        curl_setopt($curl, CURLOPT_COOKIE, "ChosenSite=www; SportsDirect_AnonymousUserCurrency=GBP; language=en-GB");
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSLVERSION, 3);
        curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
        curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
        curl_setopt($curl, CURLOPT_VERBOSE, true);
        $str = curl_exec($curl);  
        curl_close($curl);  


    libxml_use_internal_errors(true); 
    $doc = new \DOMDocument();
    $doc->loadHTML($str);

    $xpath = new \DOMXpath($doc);
    $value = $xpath->query('//td[em="GBP"]/parent::tr/td[last()]')->item(0)->nodeValue;

    print_r($value);


此代码完全不起作用。
您能帮我解决一下吗?

提前致谢!

最佳答案

使用XPath parent轴和last()谓词:

libxml_use_internal_errors(true); 
$doc = new \DOMDocument();
$doc->loadHTML($str);

$xpath = new \DOMXpath($doc);
$value = $xpath->query('//td[em="GBP"]/parent::tr/td[last()]')->item(0)->nodeValue;

print_r($value);  // "2.37970"


DEMO link

关于php - DOMDocument/Xpath-如何从表中获取特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38555712/

相关文章:

PHP 将文件上传到网络服务器根目录之外的目录

php - 用于 php 文件的 javaScript,不要等待回复

php - 在 OutOfMemory 异常时让 PHP 转储堆

javascript - php返回结果,等待,返回结果

javascript - CasperJS:如何填写 asp 表单

xpath - 绝对 xpath 和相对 xpath 有什么区别? Selenium 自动化测试中哪个是首选?

php - 如何从另一台服务器获取 html 页面,并在该文件的特定位置插入 php 代码

java - 将 XPath 查询应用于 Java 中的 SOAPMessage

xpath - 使用 xpath 提取 anchor 标记内的文本

sql - 使用 XQuery 在 XML 中选择除一个以外的所有节点