2014-04-29 146 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:")])

相關問題