TS: SR-Nachrichten Excerpt, Grabbel- und Guck-Lösung

Beitrag lesen

Hallo Leute,

Danke nochmals für Deine Mühe. Ich habe mir das jetzt davon genommen und eingebaut, was ich brauchen konnte - und bisher keine missratenen Zeichen entdecken können!

Ich mach da auch immer noch Gehübungen mit der DOMDocument-Klassensammlung. Alles ist mir noch nicht klar. Vorhin ist mir durch die Unstabilitäten der SR-Online-Seite noch eine Merkwürdigkeit mit der Auswertung der XPath-Queries untergekommen. Leider nutzen die nicht immer dieselben Überschriften. Mal H1 und mal H2. Und der Bereich "<div></div>" hinter der eigentlichen Teaser-Meldung ist auch nicht immer vorhanden. Und da blieb dann der Teaser leer, obwohl das Query dafür vorhanden war und augenscheinlich zum vorhandenen XPath passte. Hier deshalb nochmal eine Guck- und Nachdenklösung, die einfach per Copy & Paste eine sinnvolle Ausgabe ergeben sollte.

Ich suche noch nach einer anderen Möglichkeit, aus einem eindeutigen XPath wieder eine $node zu machen. Aber das geht vermutlich nur über die Elementliste, die man per query() erhält.


<?php  ### utf-8 ###
## $dom->loadHTML verursacht immer Warnungen beim Parsen, wenn das Dokument 
## Fehler enthält. Das habe ich leider nicht abgeschaltet bekommen.  
## Damit die Warnungen nicht stumpf abgeschaltet werden müssen, sondern
## für die Nutzung zur Verfügung stehen, werden sie in $_errors gesammelt


header('Content-Type: text/html; CharSet="utf-8">');
$_errors = array();


#==============================================================================
function handleError($errno, $errstr, $errfile, $errline, array $errcontext) 
{
	global $_errors;

	$_errors[] = array('errno' => $errno, 'errstr' => $errstr, 
		'errfile' => $errfile, 'errline' => $errline); # , 'context' => $errcontext); 
}

#==============================================================================
function get_links($node = NULL)
{
	if ($node === NULL) return false;
	$_links = array();
	
	$__linklist = $node->getElementsByTagName('a');

	## Liste der Links durcharbeiten
	if ($__linklist->length > 0)
	{	
		foreach ($__linklist as $key => $__link)
		{
			## falls Attribute vorhanden sind
			if ($__link->hasAttribute('href'))
			{	
				$_links[$key]['href'] = $__link->getAttribute('href'); 
				$_links[$key]['linktext'] = $__link->textContent;
			}	
		}
    }
	return $_links;
} 
#==============================================================================
function get_nodepathes($node, $link = '')
{
    $output = "[$link]: \r\n";
    $_elements = $node->getElementsByTagName('*');
    
    foreach ($_elements as $key => $element)
    {
        $output .= $element->getNodePath() . "\r\n";
    }

    return $output . "\r\n";
}

#==============================================================================
## php main
#==============================================================================

$scheme = 'http://';
$domain = 'www.sr-online.de';
$url = $scheme . $domain . '/sronline/nachrichten/hoerfunknachrichten/hoerfunknachrichten_aktuell100.html';

$page = file_get_contents($url);
$meta = '<?xml encoding="UTF-8" ?'.'>' . "\r\n";  ## Das reicht der DOMDocument-Class jetzt aber!

	$dom = new DOMDocument('1.0', 'utf-8');
	$dom->encoding = 'utf-8';
	$dom->validateOnParse = true;
	$dom->strictErrorChecking = true ;
#       $dom->substituteEntities = true;

	$dom->preserveWhiteSpace = true;

	set_error_handler('handleError', E_WARNING);
	$dom->loadHTML($meta . $page);
	restore_error_handler();

	## 	hier wird der Hauptcontainer referenziert
	$node = $dom->getElementById('mitte_text');

	$_links = get_links($node);

    $output = '';
    
	foreach ($_links as $key => $link)
	{
		$container = file_get_contents($scheme.$domain.$link['href']);
		set_error_handler('handleError', E_WARNING);		
		$dom->loadHTML($meta . $container);
		restore_error_handler();		
		$node = $dom->getElementById('mitte_text');
		$nodexpath = $node->getNodePath();

        $output .= get_nodepathes($node, $link['href']);
		
		$xpath = new DOMXpath($dom);

		$elements = $xpath->query($nodexpath .'/h1');	
		if ($elements->length > 0 ) $_links[$key]['heading_1'] = $elements->item(0)->textContent;		

		## SR benutzt leider manchmal H1 und manchmal H2 an dieser Stelle
#		$elements = $xpath->query($nodexpath .'/div[1]/h1');	
        ## Der textContent von div[1]/h1 ist auch schon in div[1] enthalten
		$elements = $xpath->query($nodexpath .'/div[1]');	
		if ($elements->length > 0 ) $_links[$key]['heading_2'] = $elements->item(0)->textContent;		

#		$elements = $xpath->query($nodexpath .'/div[1]/h2');	
#   		if ($elements->length > 0 ) $_links[$key]['heading_2'] = $elements->item(0)->textContent;		

#		$elements = $xpath->query($nodexpath .'/div[1]/p');	
#		if ($elements->length > 0 ) $_links[$key]['teaser'] = $elements->item(0)->textContent;
		
#		$elements = $xpath->query($nodexpath .'/div[2]/p');	
        ## Der textContent von div[2]/p ist auch schon in div[2] enthalten
		$elements = $xpath->query($nodexpath .'/div[2]');	## Der textContent von div[2]/p ist auch in div[2] enthalten
		if ($elements->length > 0 ) $_links[$key]['teaser'] = $elements->item(0)->textContent;
	}

	
	file_put_contents('sr-online.' . date('Ymd_His') . '.txt', htmlspecialchars(print_r($_links, 1)));

	
###################################################################################################	
## HTML Out
###################################################################################################		
?>
<?php echo $meta; ?>
<!DOCTYPE HTML>
<html lang="de">

<head>
	<title>SR-Online</title>
</head>
<body>

<pre>	
<?php 
    echo htmlspecialchars($output);
	echo htmlspecialchars(print_r($_links, 1)); 
?>
</pre>	
</body>
</html>

Ich habe die Auskommentierten Versuche drin gelassen, damit man sehen kann, wie ich es außerdem noch versucht habe.

Da in $node->textContent auch derjenige Textcontent der untergeordenten Nodes enthalten ist, wenn es solche gibt, benutze ich hier immer die übergeordneten.

Man könnte wegen der Rückwandlung von Entities nun noch versuchen, die Einstellung

   $dom->substituteEntities = true;

ausprobieren. Mir sind aber bisher noch keine Entities wieder untergekommen. Ich müsste dafür also extra nochmal ein Testdokument bauen.

Bei der Ausgabe müsste man dann allerdings wieder dran denken, htmlspecialchars() zu verwenden, was man ja eigentlich sowieso lieber selber machen sollte und sich nicht darauf verlassen sollte, dass SR-Online schon fertig vorgekautes Material liefert. Wenn Du dir die $_errors ausgeben lässt, wirst Du nömlich feststellen, dass sie in den Links das Ampen (&amp;) vergessen haben. Das merkt der DOM-Parser.

Tschüss
TS

0 139

htmlentities "bereinigen"

glupto
  • php
  1. 0
    dedlfix
  2. 1
    TS
    1. 0
      glupto
      1. 0
        Auge
        1. 0

          Korrektur meines vorherigen Postings

          Auge
          1. 0
            glutpo
            1. 1
              Der Martin
              1. 0
                glutpo
                1. 0
                  Der Martin
                  1. 0
                    glutpo
                    1. 0
                      Der Martin
                      1. 0
                        glutpo
                        1. 0
                          Der Martin
                        2. 0

                          meta-charset - Angabe war nicht innerhalb der ersten 1024 Bytes

                          TS
                          1. 0
                            dedlfix
                            1. 0

                              Fakten, Fakten, Fakten

                              TS
                              • meinung
                              • php
                  2. 0
                    Gunnar Bittersmann
            2. 0
              Auge
              • html
              • php
              1. 0
                glutpo
                1. 0
                  Camping_RIDER
                  1. 0
                    Gunnar Bittersmann
                    1. 0
                      Camping_RIDER
                    2. 0

                      Meta-Angabe im File unerheblich?

                      TS
                    3. 0

                      Offenheit für Fehlerquellen

                      Camping_RIDER
                      • html
                      • menschelei
                      • php
                  2. 0
                    glutpo
                    1. 0
                      Matthias Apsel
                      1. 0
                        Gunnar Bittersmann
                        1. 0
                          Tabellenkalk
                      2. 0
                        Tabellenkalk
                2. 1
                  Auge
                  1. 0
                    dedlfix
                    1. 0

                      Aha, dann weiter im Text.

                      Auge
                      1. 0
                        Gunnar Bittersmann
                        • html
                        • sprache
                        1. 0
                          Auge
                        2. 0
                          Gunnar Bittersmann
                      2. 0
                        dedlfix
                        1. 0

                          Danke erstmal an alle,...

                          glupto
                          1. 0
                            dedlfix
                    2. 0
                      TS
                  2. 0
                    glupto
                    1. 0
                      dedlfix
                    2. 0
                      woodfighter
                      1. 0

                        dein Impressum

                        woodfighter
                        • recht
                        1. 0
                          glupto
                          1. 0
                            Der Martin
                      2. 0
                        glupto
                        1. 2
                          dedlfix
                          1. 0
                            glupto
                            1. 0
                              Camping_RIDER
                              1. 0
                                dedlfix
                                1. 0
                                  Camping_RIDER
                                2. 0
                                  glupto
                                  1. 0
                                    Auge
                                    1. 0
                                      glupto
                                      1. 0
                                        Auge
                                    2. 0
                                      glupto
                                      1. 0
                                        Auge
                                        1. 0
                                          glupto
                                          1. 0
                                            Auge
                                            1. 0
                                              glupto
                                              1. 0
                                                Auge
                                                • php
                                                1. 0
                                                  glupto
                                                  1. 0
                                                    TS
                                                    1. 0

                                                      DOMDocument: Fehlerhaftes Parsing und Dekodierung, [gelöst]

                                                      TS
                                                      1. 0
                                                        glupto
                                                        1. 0

                                                          DOMDocument: Fehlerhafte Dekodierung, Jetzt aber...

                                                          TS
                                                      2. 0
                                                        dedlfix
                                                    2. 0
                                                      glupto
                                                      1. 0

                                                        Bitte ändert doch den Betreff immer passend ab

                                                        TS
                                                        • meinung
                                                        • php
                                                        1. 0
                                                          dedlfix
                                                          1. 0

                                                            Ätsch, war trotzdem falsch. Aber nun gibts Workaround:

                                                            TS
                                                            • php
                                                            1. 0

                                                              Kurzfassung

                                                              TS
                                                              1. 0
                                                                TS
                                                                1. 1
                                                                  TS
                                                                  1. 0
                                                                    dedlfix
                                                                    1. 0
                                                                      TS
                                                            2. 0

                                                              Weiterführende Gedanken zur gefundenen Lösung

                                                              TS
                                                              1. 0
                                                                dedlfix
                                                                1. 0
                                                                  TS
                                                                  1. 0
                                                                    dedlfix
                                                                    1. 0
                                                                      TS
                                                                      1. 0
                                                                        dedlfix
                                                                        1. 0
                                                                          glupto
                                                                          1. 0
                                                                            TS-ohne
                                                                            1. 0
                                                                              glupto
                                                                              1. 0

                                                                                SR-Nachrichten Excerpt

                                                                                TS
                                                                                • html
                                                                                • php
                                                                                1. 0
                                                                                  glupto
                                                                                  1. 0
                                                                                    TS
                                                                                    1. 0
                                                                                      glupto
                                                                                      1. 0
                                                                                        TS
                                                                                        1. 0
                                                                                          glupto
                                                                                          1. 0
                                                                                            Gunnar Bittersmann
                                                                                            • design/layout
                                                                                            1. 0
                                                                                              glupto
                                                                                              1. 0

                                                                                                SR-Nachrichten Excerpt, Grabbellösung

                                                                                                TS
                                                                                                • html
                                                                                                • php
                                                                                                1. 0
                                                                                                  glupto
                                                                                                  1. 0

                                                                                                    SR-Nachrichten Excerpt, Grabbel- und Guck-Lösung

                                                                                                    TS
                                                                                                    1. 0
                                                                                                      glupto
                                                                                                2. 0
                                                                                                  glupto
                                                                                                  1. 0
                                                                                                    TS
                                                                                                    1. 0
                                                                                                      glupto
                                                                                                      1. 0
                                                                                                        Auge
                                                                                                        1. 0
                                                                                                          glupto
                                                                                                          1. 0

                                                                                                            Einen Datengrabber schreiben, wie geht es weiter?

                                                                                                            TS
                                                                                                            1. 0
                                                                                                              glupto
                                                                                                              1. 0
                                                                                                                TS
                                                                                                                1. 0
                                                                                                                  glupto
                                                                                                            2. 0
                                                                                                              glupto
                                                                                                          2. 0
                                                                                                            Auge
                                                                                                            • php
                                                                                                            1. 0
                                                                                                              glupto
                                                                                        2. 0

                                                                                          Völlig offtopic, Frage an TS

                                                                                          Jörg Reinholz
                                                                                          • offtopic
                                                                                          1. 0
                                                                                            Matthias Apsel
                                                                                            • zu diesem forum
                                                                                          2. 0
                                                                                            TS
                                                                                            1. 2
                                                                                              Jörg Reinholz
                                                                                        3. 0
                                                                                          Auge
                                                                                          • https
                                                                                          • php
                                                                                          1. 0
                                                                                            glupto
                                                                                            1. 0
                                                                                              Auge
                                                                                              1. 0
                                                                                                glupto
                                                                                                1. 0
                                                                                                  Auge
                                                                                                2. 0
                                                                                                  Jörg Reinholz
                                                                                                  • https
                                                                                                  • recht
                                                                                          2. 0
                                                                                            TS
                                                                                            1. 0
                                                                                              Auge
                                                                                          3. 0

                                                                                            header('Content-Type: text/html; charset=UTF-8');

                                                                                            TS
                                                                                            1. 0
                                                                                              Auge
                                                                                              • https
                                                                                            2. 0
                                                                                              woodfighter
                                                                                              1. 0
                                                                                                RS
                                                                                                1. 0
                                                                                                  woodfighter
                                              2. 0
                                                dedlfix
                                          2. 0
                                            dedlfix
                                      2. 0
                                        dedlfix
                              2. 0
                                Auge
                                1. 0
                                  Camping_RIDER
                              3. 0
                                glupto
                                1. 0
                                  Camping_RIDER
                                2. 0
                                  Auge
                        2. 0

                          SR-Nachrichten als ISO interpretiert

                          TS
      2. 0
        TS
      3. 0
        Christian Kruse
        1. 0
          glupto