[PHP] DOM XPath - Malformed Expression or invalid contextnode

  • PHP

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Dancger.

    [PHP] DOM XPath - Malformed Expression or invalid contextnode

    Ich versuche einen Teil einer HTML Seite auszulesen. Das gesuchte div hat keine Id, aber besitzt die Klasse formatted.

    So sieht mein aktueller Versuch aus:

    PHP-Quellcode

    1. <?php
    2. /** DEBUG **/
    3. // Error Anzeige einschalten
    4. ini_set('display_startup_errors',1);
    5. ini_set('display_errors',1);
    6. error_reporting(-1);
    7. /** INCLUDES **/
    8. // Required
    9. require './lib/shdom.php';
    10. /** DECLARATIONS **/
    11. // URLs
    12. $url_rss = 'http://www.golem.de/news/ifixit-amazon-fire-phone-ist-nur-schlecht-zu-reparieren-1407-108134.html';
    13. /** MAIN RUNNING **/
    14. // Meldungen bei fehlerhaftem HTML deaktivieren
    15. libxml_use_internal_errors(true);
    16. // Vorbereitung
    17. $dom_full = new DOMDocument();
    18. $html_full = file_get_html($url_rss);
    19. $html_com = preg_replace('/<!--(.*?)-->/', '', $html_full); // Kommentare entfernen
    20. $dom_full->loadHTML($html_com);
    21. //
    22. $dom_xpath = new DOMXPath($dom_full);
    23. $dom_xpath_nl = $dom_xpath->query('//[@class="formatted"]');
    24. if($dom_xpath_nl == false){
    25. die("Malformed Expression or invalid contextnode");
    26. } else {
    27. die("Query successfully executed");
    28. }
    29. ?>


    shdom.php ist von hier: PHP Simple HTML DOM Parser.

    Ich versteh nicht, wieso meine Abfrage nicht gültig ist.
    Kann mir jemand unter die Arme greifen?
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...
    Ich hab diesen Simple HTML DOM Parser nun weggelassen, da ich mittels XPath eine funktionierende Query absetzen konnte.

    Bei dem vorherigen Ansatz hat die Angabe des (ich nenns ma:) HTML Elementtyps gefehlt.
    Aus

    PHP-Quellcode

    1. $dom_xpath_nl = $dom_xpath->query('//[@class="formatted"]');

    wurde

    PHP-Quellcode

    1. $dom_xpath_nl = $dom_xpath->query('//div[@class="formatted"]');


    Nun habe ich eine DOMNodeList.

    BTW: @slice Nutze nun curl

    Das Ziel ist nun den Inhalt des DIV's wieder in HTML zu wandeln.
    In meiner Theorie müsste ich doch nun ein neues DOM Dokument erstellen und mittels eine Schleife jede DOMNode (aus der DOMNodeList) diesem hinzufügen (Methode: DOMDocument->appendChild) können. Leider funktioniert das nicht, da ich durch die Schleife anstatt einer DOMNode ein DOMElement erhalte.

    Nun steh ich da und hab keinen Plan, wie ich wieder eine HTML Datei aus der DOMNodeList kriege.

    Der aktuelle Code sieht so aus:

    PHP-Quellcode

    1. <?php
    2. /** DEBUG **/
    3. // Error Anzeige einschalten
    4. ini_set('display_startup_errors',1);
    5. ini_set('display_errors',1);
    6. error_reporting(-1);
    7. /** DECLARATIONS **/
    8. // URLs
    9. $url_rss = 'http://www.golem.de/news/ifixit-amazon-fire-phone-ist-nur-schlecht-zu-reparieren-1407-108134.html'; //$url_rss == 'http://www.golem.de/news/atv-5-kaesespaetzle-fuer-die-iss-1407-108105.html';
    10. /** MAIN RUNNING **/
    11. // Meldungen bei fehlerhaftem HTML deaktivieren
    12. libxml_use_internal_errors(true);
    13. // URL abrufen und Sourcecode speichern
    14. $curl = curl_init();
    15. curl_setopt($curl, CURLOPT_URL, $url_rss);
    16. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    17. curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
    18. $html_full = curl_exec($curl);
    19. curl_close($curl);
    20. // Quellcode säubern (Kommentare, Skripts, NoSkripts,
    21. $html_com_cleaned = preg_replace('/<!--(.*?)-->/', '', $html_full); // Kommentare aus dem Quellcode entfernen
    22. $html_script_cleaned = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $html_com_cleaned); // Skript Tags aus dem Quellcode entfernen
    23. // DOM Vorbereitung
    24. $dom_cleaned = new DOMDocument();
    25. $dom_cleaned->loadHTML($html_script_cleaned);
    26. // Inhalt (div, class:formatted) filtern
    27. $dom_xpath = new DOMXPath($dom_cleaned);
    28. $dom_xpath_nl = $dom_xpath->query('//div[@class="formatted"]');
    29. // Vorbereitung: Ausgabe
    30. $dom_output = new DOMDocument();
    31. foreach($dom_xpath_nl as $domnode) {
    32. $dom_output->appendChild($domnode);
    33. }
    34. // DEBUG
    35. die($dom_output->saveHTML());
    36. ?>


    Folgende Meldung erhalte ich:
    Fatal error: Uncaught exception 'DOMException' with message 'Wrong Document Error' in /var/www/DOMAIN/a.php:43 Stack trace: #0 /var/www/DOMAIN/a.php(43): DOMNode->appendChild(Object(DOMElement)) #1 {main} thrown in /var/www/DOMAIN/a.php on line 43


    Kann mir jemand den Weg zeigen?
    Mein Ziel ist es eigentlich nur, das div mit der Klasse formatted auszugeben. Zusätzlich sollen Skripte und Kommentare entfernt werden.

    Edit: YEAH! Beitrag Nr. 1000 :D
    Und trotzdem, kein Bock mehr, ich geh jt pennen und hoff, morgen steht >hier< ne Lösung :P
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dancger“ ()