1

在网站允许我访问他的 API 之前,我只需要显示该网站上的两件事:

我要抓取的内容 //实时页面上的示例

这两件事包含在 div 中:

<div style="float: right; margin: 10px;">
here what i want to display on my website
</div>

问题是我在stackoverflow上找到了一个例子,但我以前从未写过preg_match。如何处理我想要抓取的数据?谢谢

<?php   $html = file_get_contents($st_player_cv->getUrlEsl());

preg_match_all(
    'What do i need to write here ?',
    $html,
    $posts, // will contain the data
    PREG_SET_ORDER // formats data into an array of posts
);

foreach ($posts as $post) {
    $premium = $post[1];
    $level = $post[2];

    // do something with data
}
4

3 回答 3

3

这样做的DOM方法是

libxml_use_internal_errors(TRUE);
$dom = new DOMDocument;
$dom->loadHTMLFile('http://www.esl.eu/fr/player/5178309/');
libxml_clear_errors();

$xPath = new DOMXPath($dom);
$nodes = $xPath->query('//div[@style="float: right; margin: 10px;"]');
foreach($nodes as $node) {
    echo $node->nodeValue, PHP_EOL;
}

但是页面中有大量的 JavaScript 会在页面加载后大量修改 DOM。由于任何基于 PHP 脚本的提取都不会执行任何 JavaScript,因此我们在 XPath 中搜索的样式还不存在并且我们不会得到任何结果(Hannes 建议的 Regex 出于同样的原因也不起作用)。徽章上的等级编号也不存在。

正如 Wrikken 在评论中指出的那样,似乎还有一些机制可以阻止某些请求。我收到过一次消息,但我不确定是什么触发了它,因为我也可以多次获取页面。

长话短说:你无法用这个页面实现你想要做的事情。

于 2010-09-30T15:42:29.937 回答
1

this regex '#<div style="float: right; margin: 10px;">(.*)</div>#' should do the trick (yeah) but i would advice you to use DOM & XPath.

edit:

Here is an Xpath / DOM Example:

$html = <<<HTML
<html>
<body>
    <em>nonsense</em>
    <div style="float: right; margin: 10px;"> here what i want to display on my website </div>
    <div> even more nonsense </div>
</body>
</html>

HTML;

$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXpath($doc);
$elements = $xpath->query('//div[@style="float: right; margin: 10px;"]');
echo $elements->item(0)->nodeValue;
于 2010-09-30T15:23:25.407 回答
1

如果你想要更通用的东西

  preg_match('/<div[^>]+?>(.*?)<\/div>/', $myhtml, $result);
  echo $result[1] . "\n";

$myhtml包含您必须分析的代码 html。$result是包含()应用正则表达式后的正则表达式和内容的数组。将为您提供and$result[1]之间的内容。<div ... ></div>

这样,即使<div不同(类名更改或不同的属性),它仍然可以工作。

于 2010-09-30T15:37:41.163 回答