php curl / xpath数据基于< p为H.文字信息?

时间:2017-06-11 17:27:38

标签: php xpath

我知道如何使用以下代码通过div id,class等标签从另一个网站发送xpath和echo文本。但是,我不知道如何在更精确的条件下执行此操作,例如在尝试刮擦并回显一些没有像div这样的唯一标记标识符的文本时。 下面的代码吐出了数据。     

$doc = new DOMDocument;

// We don't want to bother with white spaces
$doc->preserveWhiteSpace = false;

// Most HTML Developers are chimps and produce invalid markup...
$doc->strictErrorChecking = false;
$doc->recover = true;

$doc->loadHTMLFile('http://www.nbcnews.com/business');

$xpath = new DOMXPath($doc);

$query = "//div[@class='market']";

$entries = $xpath->query($query);
foreach ($entries as $entry) {
echo trim($entry->textContent);  // use `trim` to eliminate spaces
}

在下面的示例源代码中,我想拉取值“21,271.97”。但是没有唯一的标签,没有div id。是否可以通过在<中识别关键字来提取此数据? p为H.永远不会改变,例如“DJIA所有时间”。

<p>DJIA All Time, Record-High Close: <font color="#0000FF">June 9, 
2017</font> 
(<font color="#FF0000"><b bgcolor="#FFFFCC"><font face="Verdana, Arial, 
Helvetica, sans-serif" size="2">21,271.97</font></b></font>)</p>

想知道我是否可以用$ query =“// div [@ class ='market']”的行代替它; $ query =“// p ['DJIA all time']”;

这可能吗?

我也想知道是否使用类似$ query =“// p [='DJIA']”的东西的循环;?? 可以工作,虽然我不知道如何使用它。 谢谢!

2 个答案:

答案 0 :(得分:1)

尝试使用以下XPath表达式:

//p[contains(text(), "DJIA All Time")]//b/font

考虑提供的链接(http://www.nbcnews.com/business),您可以使用

获取所需的文字
//span[text()="DJIA"]/following-sibling::span[@class="market_item market_price"]

答案 1 :(得分:1)

与在线XPath测试人员玩游戏会很好 - 我使用https://www.freeformatter.com/xpath-tester.html#ad-output

$query = "//p[contains(text(),'DJIA')]";

虽然如果您使用之后的页面,我发现该值似乎是...的第一条记录。

$query = "//span[contains(@class,'market_price')]";

但两种情况下的想法是相同的,使用contains(source,value)将匹配一组节点。在第一种情况下,text()是节点的值,第二种是查找特定的类定义。