使用 DOMparser 进行 Webscraping 时的数组输出问题
Array output problem at Webscraping with DOMparser
我在代码的第二部分遇到一些输出问题。
function getSiteContent($url)
{
$html = cache()->rememberForever($url, function () use ($url) {
return file_get_contents($url);
});
$parser = new \DOMDocument();
@$parser->loadHTML($html);
return $parser;
}
libxml_use_internal_errors(true);
$url = 'https://sumai.tokyu-land.co.jp/osaka';
$parser = getSiteContent($url);
$allDivs =[];
$allDivs = $parser->getElementsByTagName('div');
foreach ($allDivs as $div) {
if ($div->getAttribute('class') == 'p-articlelist-content-right') {
$allLinks = $div->getElementsByTagName('a');
foreach ($allLinks as $a) {
$getlinks[] = $a->getAttribute('href');
}
}
}
var_dump($getlinks);
在这个 var_dump 我可以看到我抓取的链接。到这里没问题。还有一次。我想进入那些链接。这就是我在下面编写代码的原因。
getSiteContent($getlinks);
$link = [];
$siteler = [];
foreach ($siteler as $site) {
if($site == 'https://sumai.tokyu-land.co.jp'){
$site = $getlinks->getElementsByTagName('div');
foreach ($site as $links) {
if($links->getAttribute('class') == 'pc_hnavi'){
$linker = $links->getElementsByTagName('a');
foreach ($linker as $a) {
$link = $a->getAttribute('href');
}
}
}
}
}
var_dump($link);
当我var_dump它。它说数组 0
我不明白为什么它不进入那些与 foreach 的链接
我的代码错了吗?我在这里错过了什么?对此有什么想法吗?
谢谢你帮我。
看来你的问题出在这里:
...
$siteler = []; // $siteler is set to an empty array ...
foreach ($siteler as $site) { // then you loop through the empty array which does nothing ...
...
}
...
修复应该让你开始。
正如我在评论中所说,当您尝试遍历它时 $siteler
是空的,但还有几个问题:
- 首先,当 link 正好是“https://sumai.tokyu-land.co.jp”时,您的代码最多只会触发一次,我不确定这是否是您想要的。
- 您正在对数组调用
DOM
函数。
- 似乎只关心 'div' 标签内的 links。
- 您在每个循环中重新定义
$link
变量,因此最终结果将只有一个 link。
这是固定码:
$link = [];
foreach ($getlinks as $site) {
// Any link in the domain, not just the homepage
if(strpos($site, 'https://sumai.tokyu-land.co.jp') === 0) {
$dom = getSiteContent($site);
$divs = $dom->getElementsByTagName('div');
foreach ($divs as $div) {
// Can have more than one class
$attrs = explode(' ', $div->getAttribute('class'));
if(in_array('pc_hnavi', $attrs)) {
$linker = $div->getElementsByTagName('a');
foreach ($linker as $a) {
// Add to the array
$link[] = $a->getAttribute('href');
}
}
}
}
}
然而,这不会检查 link 是否已经存在于数组中,并且有可能一遍又一遍地处理相同的 link。我强烈建议使用现有的抓取工具。
根据评论,原来 pc_hnavi
是 id
而不是 class,您只对第一个 link 感兴趣。您可以直接访问该元素而无需迭代元素:
foreach ($getlinks as $site) {
// Any link in the domain, not just the homepage
if(strpos($site, 'https://sumai.tokyu-land.co.jp') === 0) {
$dom = getSiteContent($site);
$div = $dom->getElementById('pc_hnavi');
if ($div != null) {
$links = $div->getElementsByTagName('a');
if ($links->length > 0) {
$a = $links->item(0);
$link[] = $a->getAttribute('href');
}
}
}
}
我在代码的第二部分遇到一些输出问题。
function getSiteContent($url)
{
$html = cache()->rememberForever($url, function () use ($url) {
return file_get_contents($url);
});
$parser = new \DOMDocument();
@$parser->loadHTML($html);
return $parser;
}
libxml_use_internal_errors(true);
$url = 'https://sumai.tokyu-land.co.jp/osaka';
$parser = getSiteContent($url);
$allDivs =[];
$allDivs = $parser->getElementsByTagName('div');
foreach ($allDivs as $div) {
if ($div->getAttribute('class') == 'p-articlelist-content-right') {
$allLinks = $div->getElementsByTagName('a');
foreach ($allLinks as $a) {
$getlinks[] = $a->getAttribute('href');
}
}
}
var_dump($getlinks);
在这个 var_dump 我可以看到我抓取的链接。到这里没问题。还有一次。我想进入那些链接。这就是我在下面编写代码的原因。
getSiteContent($getlinks);
$link = [];
$siteler = [];
foreach ($siteler as $site) {
if($site == 'https://sumai.tokyu-land.co.jp'){
$site = $getlinks->getElementsByTagName('div');
foreach ($site as $links) {
if($links->getAttribute('class') == 'pc_hnavi'){
$linker = $links->getElementsByTagName('a');
foreach ($linker as $a) {
$link = $a->getAttribute('href');
}
}
}
}
}
var_dump($link);
当我var_dump它。它说数组 0 我不明白为什么它不进入那些与 foreach 的链接 我的代码错了吗?我在这里错过了什么?对此有什么想法吗? 谢谢你帮我。
看来你的问题出在这里:
...
$siteler = []; // $siteler is set to an empty array ...
foreach ($siteler as $site) { // then you loop through the empty array which does nothing ...
...
}
...
修复应该让你开始。
正如我在评论中所说,当您尝试遍历它时 $siteler
是空的,但还有几个问题:
- 首先,当 link 正好是“https://sumai.tokyu-land.co.jp”时,您的代码最多只会触发一次,我不确定这是否是您想要的。
- 您正在对数组调用
DOM
函数。 - 似乎只关心 'div' 标签内的 links。
- 您在每个循环中重新定义
$link
变量,因此最终结果将只有一个 link。
这是固定码:
$link = [];
foreach ($getlinks as $site) {
// Any link in the domain, not just the homepage
if(strpos($site, 'https://sumai.tokyu-land.co.jp') === 0) {
$dom = getSiteContent($site);
$divs = $dom->getElementsByTagName('div');
foreach ($divs as $div) {
// Can have more than one class
$attrs = explode(' ', $div->getAttribute('class'));
if(in_array('pc_hnavi', $attrs)) {
$linker = $div->getElementsByTagName('a');
foreach ($linker as $a) {
// Add to the array
$link[] = $a->getAttribute('href');
}
}
}
}
}
然而,这不会检查 link 是否已经存在于数组中,并且有可能一遍又一遍地处理相同的 link。我强烈建议使用现有的抓取工具。
根据评论,原来 pc_hnavi
是 id
而不是 class,您只对第一个 link 感兴趣。您可以直接访问该元素而无需迭代元素:
foreach ($getlinks as $site) {
// Any link in the domain, not just the homepage
if(strpos($site, 'https://sumai.tokyu-land.co.jp') === 0) {
$dom = getSiteContent($site);
$div = $dom->getElementById('pc_hnavi');
if ($div != null) {
$links = $div->getElementsByTagName('a');
if ($links->length > 0) {
$a = $links->item(0);
$link[] = $a->getAttribute('href');
}
}
}
}