2010-12-12 5 views
21

für meine Website möchte ich eine neue Funktionalität hinzufügen.Wie extrahiert man Links und Titel von einer HTML-Seite?

Ich möchte Benutzer möchte in der Lage sein, seine Lesezeichen Backup-Datei laden (von jedem Browser aus, wenn möglich), so kann ich es zu ihrem Profil laden und sie müssen alle von ihnen nicht manuell einfügen ...

der einzige Teil, den ich vermisse, dies zu tun, ist der Teil der Extrahierung von Titel und URL aus der hochgeladenen Datei .. kann jemand einen Hinweis geben, wo ich anfangen oder wo ich lesen soll?

verwendete Suchoption und (how to extract data from a raw html file) diese sis die damit verbundene Frage für meine und es nicht darüber reden ..

Mir macht es nicht wirklich, wenn seine jquery oder mit PHP

danken sehr viel Sie

+1

es wohl jeder helfen würde, wenn Sie Beispiele für die Arten von Lesezeichen Backup-Dateien setzen könnten Sie (für jeden Browser) unterstützen möchten – scoates

+1

Das Netscape-Format ist weit verbreitet: http://msdn.microsoft.com/en-us/library/aa753582(v=vs.85).aspx – Matthew

Antwort

43

Vielen Dank an alle, ich habe es!

der endgültige Code: Dies zeigt Ihnen den Anker Text zugewiesen und die href für alle Links in einer HTML-Datei

$html = file_get_contents('bookmarks.html'); 
//Create a new DOM document 
$dom = new DOMDocument; 

//Parse the HTML. The @ is used to suppress any parsing errors 
//that will be thrown if the $html string isn't valid XHTML. 
@$dom->loadHTML($html); 

//Get all links. You could also use any other tag name here, 
//like 'img' or 'table', to extract other tags. 
$links = $dom->getElementsByTagName('a'); 

//Iterate over the extracted links and display their URLs 
foreach ($links as $link){ 
    //Extract and show the "href" attribute. 
    echo $link->nodeValue; 
    echo $link->getAttribute('href'), '<br>'; 
} 

Wieder vielen Dank.

30

Dies ist wahrscheinlich ausreichend:

$dom = new DOMDocument; 
$dom->loadHTML($html); 
foreach ($dom->getElementsByTagName('a') as $node) 
{ 
    echo $node->nodeValue.': '.$node->getAttribute("href")."\n"; 
} 
+2

where $ html ist es der Pfad zur Datei? Vielen Dank für eine schnelle Antwort: D –

+2

@Toni, '$ html' ist die Zeichenfolge, die den HTML-Code enthält. Sie können '$ dom-> loadHTMLFile()' verwenden, um direkt von einer Datei zu laden. (Sie können es mit "@" vorsetzen, um Warnungen zu unterdrücken.) – Matthew

+0

wow! vielen Dank! scheint fast fertig zu sein! Ich kann Links bekommen, aber ich habe Probleme mit Namen oder Titeln (ich habe beide versucht) –

5

die gespeicherten Links Unter der Annahme, in einem hTML-Datei, die beste Lösung ist, ist wahrscheinlich t o Verwenden Sie einen HTML-Parser wie PHP Simple HTML DOM Parser (nie selbst ausprobiert). (Die andere Option ist die Suche mit basic string search oder regexp, und Sie sollten wahrscheinlich nie regexp verwenden, um html zu analysieren).

Nachdem die HTML-Datei zu lesen, die Parser verwenden es Funktionen mit den a-Tags zu finden:

aus dem Tutorial:

// Find all links 
foreach($html->find('a') as $element) 
     echo $element->href . '<br>'; 
3

Dies ist ein Beispiel, können Sie in Ihrem Fall verwenden diese:

$content = file_get_contents('bookmarks.html'); 

Run this:

<?php 

$content = '<html> 

<title>Random Website I am Crawling</title> 

<body> 

Click <a href="http://clicklink.com">here</a> for foobar 

Another site is http://foobar.com 

</body> 

</html>'; 

$regex = "((https?|ftp)\:\/\/)?"; // SCHEME 
$regex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)[email protected])?"; // User and Pass 
$regex .= "([a-z0-9-.]*)\.([a-z]{2,4})"; // Host or IP 
$regex .= "(\:[0-9]{2,5})?"; // Port 
$regex .= "(\/([a-z0-9+\$_-]\.?)+)*\/?"; // Path 
$regex .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?"; // GET Query 
$regex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?"; // Anchor 


$matches = array(); //create array 
$pattern = "/$regex/"; 

preg_match_all($pattern, $content, $matches); 

print_r(array_values(array_unique($matches[0]))); 
echo "<br><br>"; 
echo implode("<br>", array_values(array_unique($matches[0]))); 

Ausgang:

Array 
(
    [0] => http://clicklink.com 
    [1] => http://foobar.com 
) 

http://clicklink.com

http://foobar.com

1
$html = file_get_contents('your file path'); 

$dom = new DOMDocument; 

@$dom->loadHTML($html); 

$styles = $dom->getElementsByTagName('link'); 

$links = $dom->getElementsByTagName('a'); 

$scripts = $dom->getElementsByTagName('script'); 

foreach($styles as $style) 
{ 

    if($style->getAttribute('href')!="#") 

    { 
     echo $style->getAttribute('href'); 
     echo'<br>'; 
    } 
} 

foreach ($links as $link){ 

    if($link->getAttribute('href')!="#") 
    { 
     echo $link->getAttribute('href'); 
     echo'<br>'; 
    } 
} 

foreach($scripts as $script) 
{ 

     echo $script->getAttribute('src'); 
     echo'<br>'; 

} 
+0

Styling ist fehlgeschlagen und die Antwort ist schwer zu lesen. Bitte bearbeiten Sie Ihre Antwort und machen Sie es lesbarer – michaldo

+1

Zu viel Code für die gegebene Frage ... –

Verwandte Themen