我正在成功地抓取一个网站,以从页面中获取空间分隔的数据:

$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_replacepreg_replacesubstr函数删除(中的)$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

07-24 19:06
查看更多