我正在使用简单的网络抓取工具。下面是我习惯学习的简单html代码。
input.php
<ul id="nav">
<li>
<a href="www.google.com">Google</a>
<ul>
<li>
<a href="mail.gmail.com">Gmail</a>
</li>
</ul>
</li>
<li>
<a href="www.yahoo.com">Yahoo</a>
<ul>
<li>
<a href="mail.yahoo.com">Yahoo Mail</a>
</li>
</ul>
</li>
</ul>
我需要抓取ul[id=nav]->li
中的第一个锚标记。我用来抓取input.php的代码是
<?php
include 'simple_html_dom.php';
$html = file_get_html('input.php');
foreach ($html->find('ul[id=nav]') as $navUL){
foreach ($navUL->find('li') as $navUL_LI){
echo $navUL_LI->find('a',0)->outertext."<br>";
}
}
?>
它显示input.php中的所有锚标记。我需要只显示谷歌和雅虎。我怎样才能做到这一点?
答案 0 :(得分:1)
<?php
include 'simple_html_dom.php';
$html = file_get_html('input.php');
foreach ($html->find('ul[id=nav]') as $navUL){
foreach ($navUL->find('li') as $navUL_LI){
if(strpos($navUL_LI,'google')||strpos($navUL_LI,'google')){
echo $navUL_LI->find('a',0)->outertext."<br>";
}
}
}
?>
答案 1 :(得分:1)
在这种情况下,您可以使用children()
方法直接指出它。例如:
foreach($html->find('ul#nav') as $ul) {
foreach($ul->children() as $li) {
echo $li->children(0)->outertext . '<br/>';
}
}
或者,您也可以使用DOMDocument
+ DOMXpath
:
$dom = new DOMDocument();
$dom->loadHTML($str);
$xpath = new DOMXpath($dom);
// directly target those links
$links = $xpath->query('//ul[@id="nav"]/li/a');
foreach($links as $a) {
echo $a->nodeValue . '<br/>';
}
答案 2 :(得分:0)
我在Objective-c中做了同样的工作。
您可以使用XML或HTML api序列化您的html对象。
如果你想从冷手做这个...找到开放标签和关闭标签。
此后获得第一个孩子,然后是第二个孩子......等等...
答案 3 :(得分:0)
你可以通过以下方式实现:
<?php
foreach ($html->find('ul[id=nav]') as $navUL){
foreach ($navUL->find('li') as $navUL_LI){
echo $navUL_LI->find('a',-2)->outertext."<br>";
}
}
?>
答案 4 :(得分:0)
试试这个:
// get the children of the element #nav, i.e. the top level lis
$lis = $html->getElementById("#nav")->childNodes();
// for each child, find the first 'a' element
foreach ($lis as $li) {
$a = $li->find('a',0);
// retrieve the link text itself.
echo "link text: " . $a->innertext() . "\n";
}
有关所有这些方法的详细信息,请参阅simple-html-dom manual。
答案 5 :(得分:0)
<?php
$in = '<style> .catalog-product-view .product.attribute.overview ul { margin-top: 10px; } </style><img src="/media/wysiwyg/img/misc/made-in-the-usa-doh-blue4.png"><ul><li>Ships as (12) 40 fl oz bottles</li></ul>';
function parseTags($input, $callback) {
$len = strlen($input);
$stack = [];
$tag = "";
$data = "";
$isTag = false;
$isString = false;
for ($i=0; $i<$len; $i++) {
$char = $input[$i];
if ($char == '<') {
$isTag = true;
$tag .= $char;
} else if ($char == '>') {
$tag .= $char;
if (substr($tag, 0, 2) == '</') {
$close = str_replace('>', '', str_replace('</', '', explode(' ', $tag, 1)[0]));
$open = str_replace('>', '', str_replace('<', '', explode(' ', end($stack), 1)[0]));
if ($open == $close) {
$callback($tag, $data, $stack, $i, false);
array_pop($stack);
}
} else if (substr($tag, -2) == '/>') {
$callback($tag, $data, $stack, $i, false);
} else {
$callback($tag, $data, $stack, $i, true);
$stack[] = $tag;
}
$tag = "";
$data = "";
$isTag = false;
} else if ($char == '"' || $char == "'") {
if ($isString == false) {
$isString = $char;
} else if ($isString == $char && $input[$i-1] != '\\') {
$isString = false;
}
} else if ($isTag) {
$tag .= $char;
} else {
$data .= $char;
}
}
}
parseTags($in, function($tag, $data, $stack, $position, $isOpen) use (&$out) {
print_r(func_get_args());
});