【问题标题】:Screen Scraping PHP using preg_match使用 preg_match 截屏 PHP
【发布时间】:2011-12-14 20:54:30
【问题描述】:

我正在尝试创建一个 php 脚本,该脚本将从该网页 http://forums.moneysavingexpert.com/forumdisplay.php?f=36 检索 WOW 因子编号(右侧)并将它们存储在变量/数组中。

我查看了页面的源代码,值(整数)出现在此代码“<div style="padding: 12px 0px 0px 0px;"><strong>”之后

我目前正在尝试使用 preg_match 来检索 1 个值(在我开始检索多个值之前),但是我没有运气。当我执行 var_dump 时,我的数组中没有存储任何内容。 另外 - 我不确定是否要转义上面字符串中的 "s。如果我这样做了,那么 var_dump 会打印出来

数组(0) { }

如果我不这样做,则打印出 var_dump

我使用的代码如下:

<html>
<head>
<title>
MSE Value Extractor
</title>
</head>
<body>
<?php

echo "Welcome to MSE deal finder!\n";

$content = file_get_contents('http://forums.moneysavingexpert.com/forumdisplay.php?f=36');

preg_match('/<div style=\"padding: 12px 0px 0px 0px;\"><strong>(.)</', $content, $match);
var_dump($match);
$value = $match[1];

echo "Value obtained is $value \n";

?>

</body>
</html>

如果有人能评论我哪里出错了,我们将不胜感激。我对php不是很熟悉。

提前致谢

【问题讨论】:

  • &lt;div ...&gt;&lt;strong&gt;之间有whitespace
  • easydomparser 可以让您获取页面上的任何数据,他们已经为您完成了困难的部分,您只需将甜蜜的数据拉入您的应用程序。
  • 作为 [regex] 匹配的替代方法(您似乎太缺乏经验),您可以使用QueryPath 和一个简单的htmlqp($url)-&gt;find("div &gt; strong")-&gt;text();。虽然通过style= 属性匹配同样模棱两可,所以你必须希望不存在其他 div/strong 对。
  • 我认为你应该先阅读this

标签: php


【解决方案1】:

我不认为使用 style 属性是非常语义化的......这是一个使用 DOMDocument 和 xpath 查询的解决方案:

<?php
$doc = new DOMDocument();
/* This page gives a loooot of warnings (probably because it's 
 * Money Saving Expert, not html expert)
 * Just ignore them with an @ 
 */
@$doc
  ->loadHTMLFile('http://forums.moneysavingexpert.com/forumdisplay.php?f=36');

$xpath = new DOMXPath($doc);
/* look for strong elements in td elements with a class attribute containing
 'popularity_threadbit_column' */
$list = $xpath
  ->evaluate("//td[contains(@class, 'popularity_threadbit_column')]//strong");
echo sprintf("found %d elements :" . PHP_EOL, $list->length);
foreach ($list as $element)
{
  echo $element->nodeValue . PHP_EOL;
}

输出:

$ php wow.php
found 27 elements :
5
0
0
0
0
1
0
922
112
0
290
661
390
18
2
51
0
31
163
163
46
33
103
50
90
0
109

现在你可以尝试写一个正则表达式来做同样的事情,但我认为它会比我们这里的 xpath 表达式丑得多!

【讨论】:

  • @cud_programmer:请在为您的正则表达式问题选择 dom 答案时重新标记您的问题。
  • @mario:你为什么不自己做呢?我不认为 cud_programmer 会介意。
  • 不。不是我的职责。我只是想抱怨标签腐烂。 (虽然在这一点上实际上并不是完全可以修复的)。但我至少会找到一个重复的......
【解决方案2】:

我不确定 regex 是不是最好的方法,尽管它肯定符合要求。

如何使用 domparser,如 http://simplehtmldom.sourceforge.net/,像在 jQuery 中一样遍历 HTML(如果您熟悉 jQuery)?

【讨论】:

  • 我建议进入使用正则表达式不是这样做的好方法;就目前而言,这个答案并不是一个答案,而是更多的评论。
【解决方案3】:

您似乎需要在正则表达式中的 (.) 之后添加一个 *

你可以在这里测试你的正则表达式:http://www.pagecolumn.com/tool/pregtest.htm

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多