我正在成功地抓取一个网站,以从页面中获取空间分隔的数据:
$html = file_get_contents("http://www.somewebsite.com");
$scores_doc = new DOMDocument();
$scores_doc->loadHTML($html);
$scores_path = new DOMXPath($scores_doc);
$scores_row = $scores_xpath->query('//td[@class="first"]');
foreach($scores_row as $row){
echo $row->nodeValue . "<br/>";
}
示例输出:
23 Crimmons, Bob (CA)
48 Silas, Greg (RI)
82 Huston, Roger (TX)
21 Lester, Terry (NC)
与使用“echo”打印输出不同,我需要将值分成四个较小的部分并分成变量(数组或其他)。我对mysql方面非常了解,只是不经常使用php。我尝试(代替“echo”并将其定义为数组之后):
$data[] = echo $row->nodeValue;
最佳答案
关于所用语法的旁注:
如果您只想将整个23 Crimmons, Bob (CA)
字符串作为一个字符串分配给一个数组。你应该使用正确的语法。
$data[] = echo $row->nodeValue;
应该是:
$data[] = $row->nodeValue;
你的问题有三种可能的解决方法。
解决方案1:改进刮削
将这四个值分开的最好方法是更具体地查询。您可以尝试在第行更新xpath查询:
$scores_xpath->query('//td[@class="first"]');
您可以使用的查询取决于您正在抓取的页面的结构。
解决方案2:使用php explode拆分字符串
您可以使用php的explode function来分隔字符串,但请注意,当名称中使用空格时,会出现一些问题。
echo $row->nodeValue . "<br/>";
可能是这样的:
// Assuming that $row->nodeValue will have the string `23 Crimmons, Bob (CA)` as it's value
$explodeRow = explode(' ', $row->nodeValue);
/*
* $explodeRow now contains four values.
*
* $explodeRow[0] = "23";
* $explodeRow[1] = "Crimmons,";
* $explodeRow[2] = "Bob";
* $explodeRow[3] = "(CA)";
*/
例如,您可以选择使用phpstr_replace、preg_replace或substr函数删除
(
中的)
和$explodeRow[3]
字符。解决方案3:使用正则表达式拆分字符串
或者你可以决定先取前两个数字。然后获取
()
之间的最后一部分。然后通过,
将剩下的两个值分开。但当使用多个逗号时,这也会产生问题。这个解决方案的例子如下:
preg_match("~^(\d+)~", $row->nodeValue, $number);
$number[1]; # will be 23
preg_match("#\((.*?)\)#", $row->nodeValue, $last);
$last[1]; # will be CA
$middleExp = explode("(", $row->nodeValue, 2);
$middle = substr((strlen($number[1])-1), strlen($row->nodeValue), $middleExp[0]);
$middleExp2 = explode(",", $middle);
$middleL = $middleExp2[0]; # will be Crimmons
$middleR = $middleExp2[1]; # will be Bob