在网站允许我访问他的API之前,我只需要在这个网站上显示两件事:
What i want to grab // Example on a live page
这两件事包含在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
}
答案 0 :(得分: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在评论中指出的那样,似乎还有一些阻止某些请求的机制。我有一次消息,但我不确定是什么触发它,因为我也可以多次获取页面。
简而言之:你无法达到你想要用这个页面做的事情。
答案 1 :(得分:1)
这个正则表达式'#<div style="float: right; margin: 10px;">(.*)</div>#'
应该可以解决问题(是的)但我会建议你使用DOM&amp; XPath的。
编辑:
这是一个Xpath / DOM示例:
$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;
答案 2 :(得分:1)
如果你想要更通用的东西
preg_match('/<div[^>]+?>(.*?)<\/div>/', $myhtml, $result);
echo $result[1] . "\n";
$myhtml
包含您必须分析的代码html。 $result
是在应用正则表达式后包含正则表达式和()
内容的数组。 $result[1]
将为您提供<div ... >
和</div>
之间的内容。
这样,即使<div
不同(类名更改或属性不同),它仍然有效。