我正在尝试从谷歌搜索结果页面抓取所有粗体术语并将它们放入关联数组中,但结果很不稳定。它似乎只提取单个单词术语,有时(取决于查询)它会抓取不加粗的单词。有谁知道我做错了什么?提前谢谢。
$gurl = "http://www.google.com/search?q=marketingpro";
$data = file_get_contents($gurl);
// get bolded
preg_match_all('/<b>(\w+)<\/b>/', $data, $res, PREG_PATTERN_ORDER);
$H = $res[0];
foreach($H as $X){
$bold = strtolower($X);
$array[$bold] += 1;
}
print_r($array);
答案 0 :(得分:1)
尝试:
$doc = new DOMDocument();
@$doc->loadHTMLFile('http://www.google.com/search?q=marketingpro');
$xpath = new DOMXpath($doc);
$terms = array();
foreach ($xpath->query('//b') as $b)
{
$terms[$b->nodeValue] = true;
}
var_dump(array_keys($terms));
对我来说,我得到:
array(15) {
[0]=>
string(3) "Web"
[1]=>
string(13) "marketing pro"
[2]=>
string(12) "marketingpro"
[3]=>
string(3) "..."
... snip ...
[14]=>
string(9) "marketing"
}
答案 1 :(得分:0)
/<b>(\w+)<\/b>/
只有在内部有一个单词时才会匹配,空格和0-9a-z以外的字符和_将在结果中省略。我建议寻找/<b>([^<]+)<\/b>/
或dom / xml解析器(但由于谷歌有无效的html,可能会失败)
答案 2 :(得分:0)
您可以考虑使用DOM解析器。这里有一个:
http://simplehtmldom.sourceforge.net/
或者,做这样的事情:
function getTextBetweenTags($string, $tagname)
{
$pattern = "/<$tagname>(.*?)<\/$tagname>/";
preg_match($pattern, $string, $matches);
return $matches[1];
}
只要$ tagname没有任何属性就行,只有“”标签不应该。
答案 3 :(得分:0)
它只提取单个单词,因为这就是\w+
的含义。您可以使用更广泛的匹配模式,例如([^<>]+)
。
或者更好的是,使用QueryPath or phpQuery,这对眼睛来说更容易:
foreach (qp($html)->find("b") as $bold) {
$bold = strtolower($bold->text());
$array[$bold] += 1;
}