伙计们我正在开发一个脚本,该脚本从curl链接解析HTML输出数据。
这是HTML DOM解析器 - http://simplehtmldom.sourceforge.net
让我告诉你我的解析器:
<?PHP
include_once('./simple_html_dom.php');
$url = "http://www.sportsdirect.com/muddyfox-cycling-short-sleeved-jersey-mens-636266?colcode=63626622";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSLVERSION, 3);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
$str = curl_exec($curl);
curl_close($curl);
$html= str_get_html($str);
$SIZEID = 'UK: 8-13 Kids / EU: 25-32 Kids';
$occurencies = preg_match_all('/(?<=\"SizeName\":\"' . preg_quote($SIZEID, "/") . '")\S+/i', $str, $match);
foreach($html->find('#ulColourImages li') as $selectnocolor)
$colvarid = $selectnocolor->colvar-id;
$tooltiptext = $selectnocolor->tooltiptext;
echo "$tooltiptext - $colvarid";
因此,当我获取我需要的页面时,我会得到纯文本,我必须从中获取特定部分。
以下是完整文字:http://pastebin.com/FwK9Z8CP
让我描述一下我的需求。
在文本中,此特定单词ColVarId
共出现3次。
每ColVarId
后,有几个"SellPrice":"PRICEHERE"
。
例如,在文字"SellPrice":"£4.49"
中,此SellPrice
字词会向我提供有关价格的信息。这就是我想要在决赛中取得的成就,我希望得到特定"SellPrice":"MYTargetText"
我想做什么,但不知道如何:
例如,我希望在第二次出现ColVarId
单词之后获取所有文本,然后从我想要选择的提取文本中选择例如SellPrice
的第三次出现,其结构类似例如"SellPrice":"£4.49"
,在此示例中价格为4.49
。
所以我想得到那里的价格。我该怎么做?
我希望我能很好地描述我的问题,并且你理解我想要在决赛中取得的成就。
提前致谢。
答案 0 :(得分:2)
由于这是php,如何使用json_decode
呢?虽然正则表达式看起来很可靠,但如果将来需要,json_decode将更加可靠,并提供更多功能来访问对象中的其他属性。
在下面的解决方案中,我使用preg_replace
在字符串的开头字符串输出javaScript。然后我解码剩下的json,所以我将数据作为对象。
$colourJavascript = preg_replace('/^[^=]+=/', '', $colourJavascript);
$data = json_decode($colourVariantsInitialData);
print_r($data[0]->SizeVariants[0]->ProdSizePrices->SellPrice);
print_r($data[0]->SizeVariants[1]->ProdSizePrices->SellPrice);
print_r($data[0]->SizeVariants[2]->ProdSizePrices->SellPrice);
如果您需要数值,而不是样本数据中格式化的货币,您可以使用NumberFormatter
来提取值。
$formatter = new NumberFormatter("en-GB", \NumberFormatter::CURRENCY);
$priceRaw = $data[0]->SizeVariants[0]->ProdSizePrices->SellPrice;
print_r($formatter->parse($priceRaw));
<强> Full Gist 强>
答案 1 :(得分:1)
您在Pastebin上链接的示例看起来像JavaScript,而不是HTML。完全不同的语言。你绝对不应该使用正则表达式来解析PHP原生支持的数据格式。
理想情况下,它应该在JavaScript中解析。如果你必须在PHP中解析它,然后剥离JavaScript部分(开头是var colourVariantsInitialData=
,最后是分号),然后使用{将JSON部分插入到PHP数组中{3}}。例如:
<?php
$s = file_get_contents("http://example.com/path/to/data.json");
preg_match('/^[^=]+ *= *(.*);$/', $s, $a);
$output = json_decode($a[1]);
// Now simply go find SellPrice inside ColVarId.
答案 2 :(得分:1)
首先尝试避免simple_html_dom,这是有史以来最差的解析器(最慢)而不是那么简单。花点时间学习如何使用DOMDocument和DOMXPath(有大量关于XPath 1.0的教程)来做同样的工作(请注意,一旦你学会了php,你就可以将它用于很多其他语言了这是随处可见的。)
第二步是提取json字符串并构建一个json对象。
一般建议:当你使用这种格式在鼻子下形成数据时,它比字符串方法更方便。
$url = 'http://www.samplehost.com/samplepage.php';
// discard notices and warnings about badly formated html
libxml_use_internal_errors(true);
$dom = new DOMDocument;
// or get the file content via curl and use $dom->loadHTML($content);
$dom->loadHTMLFile($url);
$xp = new DOMXPath($dom);
// '//' means everywhere in the DOM tree, 'script' is the target node,
// and [...] encloses conditions about this node:
// normalize-space is used here to trim leading spaces,
// the dot refers to the current node content
$qry = '//script[starts-with(normalize-space(.), "var colourVariantsInitialData")]';
// an xpath query returns a nodeList, to get the first (and unique here)
// item of the list, you need to use ->item(0)
$rawtxt = $xp->query($qry)->item(0)->nodeValue;
// extraction of the json string and creation of a json object
$jsonStart = strpos($rawtxt, '[');
$jsonEnd = strrpos($rawtxt, ']');
$collections = json_decode(substr($rawtxt, $jsonStart, $jsonEnd - $jsonStart + 1));
// Then you can easily extract what you want from the json object
echo "collection id: " . $collections[1]->ColVarId . "\n";
foreach ($collections[1]->SizeVariants as $item) {
printf("%-30s\t%s\n", $item->SizeName, $item->ProdSizePrices->SellPrice);
}
答案 3 :(得分:0)
免责声明:这只适用于PHP,并且只有在您真正要使用正则表达式进行解析时才能使用。
这是你的正则表达式,提取3“SellPrice”:“”字符串:
ColVarId.*?\K("SellPrice":"[^"]+")
这是demo。
在PHP中使用\K
是可能的,因为它使用PCRE库。 \K
省略了与此运算符匹配的整个匹配项。并且您收到了SellPrice的详细信息。