使用 file_get_contents 并使用内容的特定部分
Posted
技术标签:
【中文标题】使用 file_get_contents 并使用内容的特定部分【英文标题】:Using file_get_contents and use specific parts of the content 【发布时间】:2012-03-29 15:55:13 【问题描述】:我正在尝试从另一个网站获取一些汇率,我正在登录并使用 file_get_contents 获取所有数据,这就是我使用的:
<?php
$username = 'myusername@gmail.com';
$password = 'mypassword';
$url = 'http://website-i-get-content-from.com';
$context = stream_context_create(array(
'http' => array(
'header' => "Authorization: Basic " . base64_encode("$username:$password")
)
));
$data = file_get_contents($url, false, $context)
?>
现在我只需要该网站的某些部分:EUR CHF 和 GBP 的汇率,在源代码中如下所示:
<tr><td>EUR</td><td align=right>USD 0.599</td><td align=right>USD 0.599</td></tr>
<tr><td>CHF</td><td align=right>USD 0.470</td><td align=right>USD 0.470</td></tr>
<tr><td>GBP</td><td align=right>USD 0.675</td><td align=right>USD 0.675</td></tr>
所以 0.599、0.470 和 0.675 是我此时需要的数字。它们确实发生了明显的变化。
如何将它们放入变量中?
【问题讨论】:
html Scraping in Php 的可能重复项 【参考方案1】:听起来你需要一个解析器。我过去使用过simpledom parser。我发现它很简单。
include("simplehtmldom/simple_html_dom.php");
$data="<html>
<body>
<table class=\"foo\">
<tr><td>EUR</td><td align=right>USD 0.599</td><td align=right>USD
0.599</td></tr>
<tr><td>CHF</td><td align=right>USD 0.470</td><td align=right>USD
0.470</td></tr>
<tr><td>GBP</td><td align=right>USD 0.675</td><td align=right>USD
0.675</td></tr>
</table>
</body>
</html>";
$html = new simple_html_dom();
$html->load($data);
foreach($html->find('table.foo tr') as $row)
$cells = $row->find('td');
if (count($cells) >= 3)
$abbr=$cells[0]->innertext; // EUR, CHF etc
$value1=$cells[1]->innertext; // USD 0.599 etc
$value2=$cells[2]->innertext; // USD 0.599 etc
echo "$abbr $value1 $value2\n";
【讨论】:
PHP 有 (DOMDocument)[php.net/manual/en/book.dom.php],做同样的事情,不需要另一个库。 Adam,感谢您抽出宝贵时间提供帮助,您的回答对我来说很有意义,尽管我从中获取数据的网站包含的内容比您 $data 变量中的内容要多得多.我知道这只是一个起点,但你能告诉我如何从页面的整个源代码中提取你在 $data 变量中的部分吗?【参考方案2】:正则表达式可以做到。
preg_match_all("'(EUR|CHF|GBP)(?=<).+USD(?<=>)\s+([\d.]+)(?=<)'", file_get_contents('...'), $matches));
虽然我没有测试它。
我知道解析 HTML 很糟糕,但这里并没有真正解析。
【讨论】:
以上是关于使用 file_get_contents 并使用内容的特定部分的主要内容,如果未能解决你的问题,请参考以下文章
为啥 file_get_contents 比 memcache_get 快?
Laravel ErrorException 使用 file_get_contents()
是否可以使用 file_get_contents() 或 cURL 进行代理?