PHP Scrape;保存为MySQL插入的变量

时间:2015-05-13 13:29:14

标签: php html mysql scrape

我成功抓取网站,以便从页面中删除空格分隔数据:

$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;

1 个答案:

答案 0 :(得分:4)

  

使用语法的旁注:   如果您只想将整个23 Crimmons, Bob (CA)字符串作为一个字符串分配给数组。您应该使用正确的语法。

$data[] = echo $row->nodeValue;
     

应该是:

$data[] = $row->nodeValue;

解决您问题的三种可能方案。

解决方案1:改善抓取

单独划分这四个值的最佳方法是更具体地查询。您可以尝试在线更新xpath查询:

$scores_xpath->query('//td[@class="first"]');

您可以使用的查询取决于您正在抓取的页面结构。

解决方案2:使用PHP爆炸拆分字符串

您可以使用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_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