我成功抓取网站,以便从页面中删除空格分隔数据:
$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)
而不是使用&#39; echo&#39;来打印输出。我需要将值拆分为四个较小的部分和变量(数组或其他)。我非常了解MySQL方面,我不会每天都使用PHP。我尝试了(代替回声&#39;并在将其定义为数组后):
$data[] = echo $row->nodeValue;
答案 0 :(得分:4)
使用语法的旁注: 如果您只想将整个
23 Crimmons, Bob (CA)
字符串作为一个字符串分配给数组。您应该使用正确的语法。$data[] = echo $row->nodeValue;
应该是:
$data[] = $row->nodeValue;
单独划分这四个值的最佳方法是更具体地查询。您可以尝试在线更新xpath查询:
$scores_xpath->query('//td[@class="first"]');
您可以使用的查询取决于您正在抓取的页面结构。
您可以使用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)";
*/
您可以选择使用PHP str_replace,preg_replace或substr删除(
中的)
和$explodeRow[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