2010-09-28 3 views
1

мне нужно разобрать следующий пример HTML, используя запрос XPATH ..XPath запроса для разбора HTML-теги

<td id="msgcontents"> 
<div class="user-data">Just seeing if I can post a link... please ignore post 
    <a href="http://finance.yahoo.com">http://finance.yahoo.com</a> 
</div> 
</td> 

<td id="msgcontents"> 
<div class="user-data">some text2... 
    <a href="http://abc.com">http://abc.com</a> 
</div> 
</td> 

<td id="msgcontents"> 
<div class="user-data">some text3...  
</div> 
</td> 

выше HTML может повторить п не раз в странице.

Также иногда часть ..... может отсутствовать, как показано в вышеуказанных html-блоках.

Что мне нужно синтаксис XPath, так что я могу получить разобранные строки как

array1[0]= "Just seeing if I can post a link... please ignore post ttp://finance.yahoo.com" 
array[1]="some text2 htp://abc.com" 
array[2]="sometext3" 
+2

(1) Вы можете использовать кнопку «код», чтобы отступать от вашего HTML-кода, чтобы он отображался с угловыми скобками без искажения. (2) Ваш вопрос неоднозначен, потому что атрибут href имеет то же значение, что и текст привязки, и вы не уточните, какой из них вам нужен. (3) HTML не обязательно является корректным XML, поэтому понимайте, что использование XPATH (требующее XML) может не быть простоями, если вы не можете уговорить весь свой HTML в действительный XML. –

+0

XPath для выбора таких элементов 'div':'/html/body/table/tr/td/div [@ class = 'user-data'] '. Тогда вам понадобится строковое значение для каждого узла. Это зависит от метода DOM для языка хоста. – 2010-09-29 12:32:49

ответ

0

Может быть что-то вроде следующего:

$remote = file_get_contents('http://www.sitename.com'); 
    $dom = new DOMDocument(); 
    //Error suppression unfortunately, as an invalid xhtml document throws up warnings. 
    $file = @$dom->loadHTML($remote); 

    $xpath = new DOMXpath($dom); 

    //Get all data with the user-data class. 
    $userdata = $xpath->query('//*[contains(@class, \'user-data\')]'); 

    //get links 
    $links = $xpath->query('//a/@href'); 

Так доступ к одной из этих переменных, вам нужно использовать nodeValue:

$ret = array(); 
foreach($userdata as $data) { 
    $ret[] = $data->nodeValue; 
} 

Edi t: Я думал, что упомянул, что это будет все ссылки на данной странице, я предполагаю, что это то, что вы хотели?

0

Использование:

concat(/td/div/text[1], ' ', /td/div/a) 

Вы можете использовать вместо «» выше, независимо от разделителя вы хотите появляться между двумя строками.

+0

Спасибо большое .. Я пробовал ваше решение, но не получил свой результат. Я отредактировал вопрос. Пожалуйста, просмотрите его. – djk

Смежные вопросы