2014-04-29 88 views
1

好吧,所以我一直在与此战斗一段时间,所以也许有人可以帮助我。php简单的DOM解析器

我试着去得到这个HTML电子邮件中的链接:

<div id="field_11" class="fieldRow span12 lastFieldRow"> 
    <span class="caption">E-mail</span> 
    <span class="output"> 
    <script type="text/javascript"> 
    <!-- 
    document.write('<a hr'+'ef="mai'+'lto'+':'+ 
     '%40;%67;%6d;%61;%69;%6c;<\/a>'); 
    //--> 
    </script> 
    <a href="mailto:%40%67%6d%61%69%6c">@mail</a> 
    </span> 
</div> 

我试着去获取HTML代码“@mail”的一部分,在href =后“的mailto:...”部分。不是document.write()部分,而是代码中的最后一个标记。

由于某种原因,当我试图让输出类的标签跨度的孩子,它认为它只有1个孩子是脚本标签,但我似乎无法抓住电子邮件纯文本。

到目前为止我有:

$target_url = "some_web_site"; 
$html = new simple_html_dom(); 
$html->load_file($target_url); 

foreach($html->find('span[class=output]') as $d){ 
    echo $d->children(1)->plaintext . "<br />"; 
} 

任何帮助吗?

+0

你的代码应该工作,它的输出(或错误信息)是什么? –

+0

它打印出一堆这些错误:注意:尝试获取非对象的属性在/Applications/MAMP/htdocs/webcrawler/index.php在线224 – user3586322

+0

听起来像你的'load_file()'没有加载正确。你可以尝试删除第二行和第三行(两者都以'$ html'开始,并替换为'$ html = file_get_html($ target_url);'? –

回答

1

只用DOM + Xpath也是可能的。

$dom = new DOMDocument(); 
$dom->loadHtml($html); 
//$dom->loadHtmlFile($htmlFile); 
$xpath = new DOMXpath($dom); 

var_dump(
    $xpath->evaluate(
    'string(//span[@class="output"]//a[starts-with(@href, "mailto:")])' 
) 
); 

输出:https://eval.in/148063

string(5) "@mail" 

中的XPath选择所有span元件与class属性 “输出”

//span[@class="output"]

然后,它查找其中href属性开始a元件与“mailto:”

//span[@class="output"]//a[starts-with(@href, "mailto:")]

这样做的结果是a元件节点的列表(与该示例性内容的单个节点)。如果节点列表为空,则string()函数会将第一个节点转换为字符串,它将返回一个空字符串。

string(//span[@class="output"]//a[starts-with(@href, "mailto:")])

相关问题