• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Bestimmtes DIV auslesen ?

maria1

Mitglied
Hallo,

Ich will den teil hier auslesen ->

PHP:
<h2><span>File Information</span></h2>                                 <p class="fileInfo filename"><span>Filename: </span> <!-- google_ad_section_start(weight=ignore) --><strong>ExThGMOCh20m7Blx2Bi.part04.ra...</strong><!-- google_ad_section_end --></p>                 <p class="fileInfo filesize">                     File size:                    <strong>                                                     <span class="size">251.64 MB</span>                                             </strong>

Eingentlich nur class="size" und <span>Filename</span>


Hier ne URL als beispiel Download ExThGMOCh20m7Blx2Bi.part04.rar for free on Filesonic.com

Mein ansatz:

PHP:
function string_zerlegen ($gesamt, $startstring, $endstring){
    $zwischen=explode ($startstring, $gesamt);
    $ergebnis=explode ($endstring, $gesamt);
    return $ergebnis[0];
}



$url="http://www.filesonic.at/file/4084455845/ExThGMOCh20m7Blx2Bi.part04.rar";
$starttext='<div id="downloadFileInfo" class="section CL2">
                <h2><span>File Information</span></h2>
                                <p class="fileInfo filename"><span>Filename: </span> <!-- google_ad_section_start(weight=ignore) --><strong>';
$endtext="</strong>";
$seite= implode ('', file ($url));
echo "Aktuell bei Dr. web: ";
echo string_zerlegen ($seite, $starttext, $endtext);
 
Über file_get_contents(); kannst du dir den Quelltext der berechneten Seite ausgeben lassen. Diesen musst du anschließend durchsuchen. Hier rate ich dir aber zu Regulären Ausdrücken, da diese den Quelltext am schnellsten und mit höchster Präzision durchsuchen.

MfG Timmer
 
Hallo Timmer,

Hier rate ich dir aber zu Regulären Ausdrücken, da diese den Quelltext am schnellsten und mit höchster Präzision durchsuchen.
kannst du das auch begründen.

Ein Auszug aus dem PHP-Manual:
[h=3] Anmerkungen[/h] Tipp Verwenden Sie nicht preg_match(), wenn Sie nur überprüfen wollen, ob eine Zeichenkette in einer anderen Zeichenkette enthalten ist. Verwenden Sie dafür stattdessen die Funktionen strpos() oder strstr(), die das schneller erledigen.

 
Hallo Timmer,


kannst du das auch begründen.

Ein Auszug aus dem PHP-Manual:
Anmerkungen

Tipp Verwenden Sie nicht preg_match(), wenn Sie nur überprüfen wollen, ob eine Zeichenkette in einer anderen Zeichenkette enthalten ist. Verwenden Sie dafür stattdessen die Funktionen strpos() oder strstr(), die das schneller erledigen.


Er möchte doch nicht nur überprüfen, ob die Zeichenkette auf der Seite vorkommt, sondern die Zeichenkette auch auslesen. Wer redet bitte von preg_match()?! Außerdem sind Reguläre Ausdrücke präzise Suchmasken, richtig eingesetzt bekommt er alle Daten, die er von der Seite haben möchte.
 
@Timmer
Du hast doch geschrieben

da diese den Quelltext am schnellsten und mit höchster Präzision durchsuchen.

und das wollte ich so nicht stehen lassen, weil es nicht stimmt. Reguläre Ausdrücke sind nicht schneller als implementierte Funktionen in PHP.

Das man damit sein Ziel unter Umständen schneller erreicht bezweifle ich ja gar nicht. Sie haben ihre Berechtigung und werden auch von mir verwendet. Wollte lediglich diesen einen Umstand berichtigen. Viele schiessen mit regulären Ausdrücken einfach mit Kanonen auf Spatzen wenn du mich verstehst.
 
Hmm und nun :)

Also ich schau mir grade die funktion preg_match an. Kann ich diese funktion nun nutzen ?

Gibts dazu auch ein "einfacheres" beispiel ? Das auf php.net versteh ich leider nicht ganz ...
 
Tscha, und genau hier würde ich den file() Befehl einsetzen.
file() liest dir den Quelltext Zeilenweise in ein Array ein. Das kannst du dann in einer Schleife durchlaufen und bei
<div id="xxxx" bis </div> den Text schon mal vorselektieren. Das erspart unmengen an Sucherei in einem Text, der Ellen lang ist.

So macht das eben jeder anders.....
 
Gut die Idee finde ich gut !

Habs soweit das ich alles in zeilen ausgegeben bekomme

Auschnitt:

Code:
Line #[B]175[/B] :             <div id="downloadFileInfo" class="section CL2"> 
Line #[B]176[/B] :                 <h2><span>File Information</span></h2> 
Line #[B]177[/B] :                                 <p class="fileInfo  filename"><span>Filename: </span> <!--  google_ad_section_start(weight=ignore)  --><strong>ExThGMOCh20m7Blx2Bi.part04.ra...</strong><!--  google_ad_section_end --></p> 
Line #[B]178[/B] :                 <p class="fileInfo filesize"> 
Line #[B]179[/B] :                     File size:                    <strong> 
Line #[B]180[/B] :                                                     <span class="size">251.64 MB</span> 
Line #[B]181[/B] :                                             </strong>

Jetzt brauch ich nur Zeile 180 nur 251.64 MB und Zeile 177 davon nur "ExThGMOCh20m7Blx2Bi.part04.ra..."

Code:

PHP:
// Liest eine Datei in ein Array. Hier gehen wir über HTTP, um den
// HTML-Quelltext einer URL zu bekommen
$lines = file('http://www.filesonic.at/file/4084455845/ExThGMOCh20m7Blx2Bi.part04.rar');

// Durchgehen des Arrays und Anzeigen des HTML-Quelltexts inkl. Zeilennummern
foreach ($lines as $line_num => $line) {
    echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br>\n";
}

// Ein weiteres Beispiel: Einlesen einer Webseite in einen String.
// Siehe auch file_get_contents().
$html = implode ('', file ('http://www.filesonic.at/file/4084455845/ExThGMOCh20m7Blx2Bi.part04.rar'));

// Benutzung des optionalen flags-Parameters seit PHP 5
$trimmed = file('somefile.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

Wie kann ich nun nur die oben genannten werte auslesen ?
 
Du suchst einen HTML Parser für PHP. google spuckt da schon etwas aus, ich kenne mich aber mit PHP nicht gut genug aus.

Und noch ein Hinweis
Das anfordern einer HTTP resource über eine Dateifunktion, ist eine Sicherheitslücke die kein normaler Provider mehr zuläßt. PHP: Zugriff auf entfernte Dateien - Manual
 
Wenn du die Datei mit file_gets_content einliesst hast du 2 Möglichkeiten

1. mit preg_match

HTML:
$content = @file_get_contents("http://www.example.org");
$preg_one = preg_match("!<h2><span>(.*?)</h2>!", $content, $ergebnis);
echo $ergebnis[1];

2. mit PHP Stringfunktionen
HTML:
$content = @file_get_contents("http://www.example.org");
$pos1 = (strpos($content, '<h2><span>')+10);
$pos2 = strpos ($content, '</span>', $pos1);  
$ergebnis = substr($content, $pos1, $pos2-$pos1);
echo $ergebnis;

EDIT: Die 2. Variante ist etwa doppelt so schnell, habe es getestet.

Ich denke die Variante mit Arrays ist hier nicht notwendig, wenn nur nach einem Ausdruck gesucht wird, obwohl es auch geht.
 
Zuletzt bearbeitet von einem Moderator:
Reguläre Ausdrücke sind ungeeignet, um HTML zu parsen.

bobince schrieb:
You can't parse [X]HTML with regex. Because HTML can't be parsed by regex. Regex is not a tool that can be used to correctly parse HTML. As I have answered in HTML-and-regex questions here so many times before, the use of regex will not allow you to consume HTML. Regular expressions are a tool that is insufficiently sophisticated to understand the constructs employed by HTML. HTML is not a regular language and hence cannot be parsed by regular expressions. […]

- html - RegEx match open tags except XHTML self-contained tags - Stack Overflow

String-Funktionen sind ungeeignet, um HTML zu parsen.

HTML-Parser sind geeignet, um HTML zu parsen.

- PHP: DOMDocument - Manual



Datei-Funktionen sind nicht optimal, um externe Ressourcen abzurufen, weil der HTTP-Wrapper häufig deaktiviert ist (siehe auch struppi).

cURL oder Sockets sind besser geeignet.

- PHP: cURL - Manual
- PHP: Sockets - Manual

Wer das nicht von Hand programmieren möchte (anders gesagt: wer nicht wahnsinnig ist), kann auf eine fertige Komponente zurückgreifen. Zum Beispiel:

- Zend Framework: Documentation: Zend_Http - Zend Framework Manual



Wustersoss schrieb:
EDIT: Die 2. Variante ist etwa doppelt so schnell, habe es getestet.

Inklusive der file_get_contents-Zeile? ;)

PHP:
<?php


$page = 'http://www.html.de/';
$stopwatch = array();



$start = microtime(true);

$content = @file_get_contents($page);
$pos1 = (strpos($content, '<title>') + 7);
$pos2 = strpos ($content, '</title>', $pos1);
$ergebnis = substr($content, $pos1, $pos2 - $pos1);

$stopwatch['string'] = microtime(true) - $start;

printf("Found '%s' in %.3f seconds.\n", $ergebnis, $stopwatch['string']);



$start = microtime(true);

$content = @file_get_contents($page);
$preg_one = preg_match("!<title>(.*?)</title>!", $content, $ergebnis);

$stopwatch['regex'] = microtime(true) - $start;

printf("Found '%s' in %.3f seconds.\n", $ergebnis[1], $stopwatch['regex']);

Wie heißt es so schön: Trau keinem Benchmark, den du nicht selbst gefälscht hast.
 
Wie heißt es so schön: Trau keinem Benchmark, den du nicht selbst gefälscht hast.
Natürlich ohne, wir wollen ja den Unterschied der beiden Funktionen testen. Und am längsten dauert der Aufruf der Datei, die das Ergebnis verfälschen würde.

Hier mein Test:
PHP:
<?php 

$content = "<p>Lorem ipsum dolor sit amet consectetuer vitae parturient dui Suspendisse orci. Nulla semper tincidunt Mauris sapien ac et semper risus Nam fringilla. Nulla Sed pharetra id fringilla purus ante vel adipiscing ut Nam. Sollicitudin Suspendisse elit Nullam ut non velit Curabitur penatibus venenatis Curabitur. Morbi Vestibulum aliquam penatibus arcu tincidunt ac et netus non quis. Orci orci vitae ante congue dolor turpis accumsan ornare pharetra.</p>
<p>Mus est lacus et ut at magna elit amet ornare ac. Integer Vivamus Phasellus pede ac sed ac consectetuer lorem urna sit. Nulla pulvinar aliquet sem consectetuer et id velit cursus enim amet. Non vel justo auctor ligula Aliquam odio Phasellus euismod id convallis. Enim vitae Donec magna id pretium a porttitor.</p>
<p>Habitant scelerisque mauris ante ut eget Vestibulum augue justo orci elit. Semper dui congue ac risus justo ante justo sit et ornare. Semper Nullam egestas Vestibulum ipsum malesuada risus tellus elit dui facilisis. Sem elit wisi Nam magna est netus mus mus metus Phasellus. Enim tellus elit Maecenas vel id accumsan aliquam convallis sit quis. Laoreet et id vel lacinia pretium tortor eget nibh.</p>
<h2><span>Gesuchter Text</span></h2>
<p>Cum velit justo In velit urna neque risus arcu nulla Nam. Sed platea massa ipsum In vitae vel vel Sed consectetuer Quisque. Nam leo laoreet purus nulla Nullam vitae fermentum Ut pretium vitae. Maecenas id non sed In congue vestibulum justo Proin In velit. Quis habitant quis quis at In.</p>
<p>Nunc Ut convallis sodales porttitor id Sed velit leo nibh id. Malesuada Ut et eu pede purus aliquam Nam quis accumsan ut. Elit condimentum vitae eros gravida tortor semper tempus urna tristique id. Quis condimentum pellentesque nibh ac at orci Integer wisi in tempus. Vitae pellentesque convallis quis Lorem dui pellentesque et dui tellus porttitor. Wisi libero non.</p>
";
$timestart = microtime(true); 
For ($i = 1; $i <= 100000; $i++){ 
$preg_one = preg_match("!<h2><span>(.*?)</span>!", $content, $ergebnis);
}
$timeend = microtime(true);
$diff = number_format(((substr($timeend,0,9)) + (substr($timeend,-10)) - (substr($timestart,0,9)) - (substr($timestart,-10))),4);
echo "<p>preg_matsch brauchte " . $diff . " Sekunden um " . $ergebnis[1] . " zu finden</p>";

$timestart = microtime(true); 
For ($i = 1; $i <= 100000; $i++){ 
$pos1 = (strpos($content, '<h2><span>')+10);
$pos2 = strpos ($content, '</span>', $pos1);  
$ergebnis = substr($content, $pos1, $pos2-$pos1);
}
$timeend = microtime(true);
$diff = number_format(((substr($timeend,0,9)) + (substr($timeend,-10)) - (substr($timestart,0,9)) - (substr($timestart,-10))),4);
echo "<p>substr brauchte " . $diff . " Sekunden um " . $ergebnis . " zu finden</p>";
?>
 
Der Abruf der externen Ressource macht aber mehr als 99 % der Laufzeit aus. Ich habe zwar prinzipiell natürlich nichts dagegen, auch solche Fragen zu benchmarken (ganz im Gegenteil). Aber man muss sich einfach bewusst sein, dass das im großen Ganzen in allgemeinen Fällen keine wesentliche Rolle spielt. Performance geht nicht bei sowas verloren. Ein Unterschied von 20/50/100/300 % macht da im Endeffekt den Kuchen nicht fett.

Ich kann den Eindruck aber bestätigen, dass der reguläre Ausdruck langsamer ist.

Noch ein Wort zum Fälschen von Benchmarks:

PHP:
$content = str_repeat('<h2><span', 10000);
$search = '<h2><span>Gesuchter Text</span>';
$content .= $search;

Code:
substr brauchte 2.950 Sekunden um Gesuchter Text zu finden
preg_matsch brauchte 26.249 Sekunden um Gesuchter Text zu finden

Faktor ~9

PHP:
$content = str_repeat('aaaaaaaaa', 10000);
$search = '<h2><span>Gesuchter Text</span>';
$content .= $search;

Code:
substr brauchte 0.493 Sekunden um Gesuchter Text zu finden
preg_matsch brauchte 2.104 Sekunden um Gesuchter Text zu finden

Faktor ~4

PHP:
$content = str_repeat('aaaaaaaaa', 100);
$search = '<h2><span>Gesuchter Text</span>';
$content .= $search;

Code:
substr brauchte 0.104 Sekunden um Gesuchter Text zu finden
preg_matsch brauchte 0.091 Sekunden um Gesuchter Text zu finden

Faktor ~1



Es spielt übrigens meiner Erfahrung nach auch eine Rolle, in welcher Reihenfolge der Test-Code ausgeführt wird. Ein fairer Test müsste eigentlich verschiedene PHP-Aufrufe nutzen.
 
Der Abruf der externen Ressource macht aber mehr als 99 % der Laufzeit aus. Ich habe zwar prinzipiell natürlich nichts dagegen, auch solche Fragen zu benchmarken (ganz im Gegenteil). Aber man muss sich einfach bewusst sein, dass das im großen Ganzen in allgemeinen Fällen keine wesentliche Rolle spielt. Performance geht nicht bei sowas verloren. Ein Unterschied von 20/50/100/300 % macht da im Endeffekt den Kuchen nicht fett.

Da stimme ich mit dir überein. Ich hatte auch nicht beabsichtigt da jetzt eine Diskussion auszulösen über performantes PHP. Wollte Maria lediglich aufzeigen wie sie ihr Problem lösen kann und habe dabei gleich mal einen Test draus gemacht um auf die Unterschiede hinzuweisen.

Interessant finde ich aber deine Beispiele zur Testverfälschung, aber dass man sich da nicht auf andere verlassen sollte hast du ja bereits geschrieben.
 
Wustersoss schrieb:
Da stimme ich mit dir überein. Ich hatte auch nicht beabsichtigt da jetzt eine Diskussion auszulösen über performantes PHP. Wollte Maria lediglich aufzeigen wie sie ihr Problem lösen kann und habe dabei gleich mal einen Test draus gemacht um auf die Unterschiede hinzuweisen.

Ja, da sagst du was… Speziell ich (ich will da keinen Anderen mit reinreiten ;)) habe es in letzter Zeit irgendwie nicht so damit, das Topic beizubehalten. Das tut mir Leid, aber ich denke, solche Diskussionen sind dennoch ganz interessant.

Interessant finde ich aber deine Beispiele zur Testverfälschung, aber dass man sich da nicht auf andere verlassen sollte hast du ja bereits geschrieben.

Ich versuche immer darauf hinzuweisen, dass Benchmarks nicht zwingend ein brauchbarer Indikator sind. Es ist zwar durchaus möglich, gewisse Pauschalaussagen zu treffen („Einfache String-Funktionen sind – normalerweise – schneller als reguläre Ausdrücke.“). Aber erstens führen sie schnell zu falschen Schlüssen (siehe mein „Verfälschungsbeispiel“[1]), zweitens ist Optimierung nicht immer notwendig (Entwicklungszeit wird um 10 % verlängert für 1 % Performance-Gewinn in einem Bereich, in dem die Ausgaben ohnehin mit „Luft nach oben“ gecachet werden), drittens führen sie bei Mikrooptimierung gerne zu schwerer wartbarem Code, der einfach zu „clever“ geschrieben ist.

- Program optimization - Wikipedia, the free encyclopedia



[1] Zudem wird in der echten Anwendung ein Code eben zumeist nicht 10.000-mal hintereinander ausgeführt, sondern einmal. Das kann unterschiedliche Effekte ergeben, weil die Programmierung von Bibliotheken teilweise clever ist und Caching verwendet. Von der Optimierung, die PHP oder ein Betriebssystem eventuell vornehmen könnten, ganz zu schweigen. Das macht es schwierig, Benchmarks zu beurteilen, weil häufig nicht alle Hintergründe bekannt sind. (Tendenzen festzustellen, halte ich aber dennoch für absolut legitim.) Hier etwa ein Auszug aus der PCRE-Dokumentation:

SAVING PRECOMPILED PATTERNS FOR LATER USE

The compiled form of a regular expression can be saved and re-used at a
later time, possibly by a different program, and even on a host other
than the one on which it was compiled. Details are given in the
pcreprecompile documentation.

- http://www.pcre.org/pcre.txt

Dieses Feature wird PHP vermutlich nutzen (ich habe nicht nachgeforscht). Die regulären Ausdrücke sind im hier besprochenen Fall zwar dennoch langsamer. Aber der Dokumentationsausschnitt dürfte verdeutlichen, dass ein Test mit 10.000 Durchläufen nicht unbedingt die 10.000-fache Zeit eines einfachen Durchlaufs benötigt.

Ein Beispiel, das ich bei Performance-Fragen immer gerne heranziehe, ist der Unterschied zwischen substr und mb_substr.

PHP:
<?php // Datei-Encoding: UTF-8

mb_internal_encoding('UTF-8');

$__length = 100000;




$content = str_repeat('ä', $__length);
$count   = strlen($content);

$timestart = microtime(true);
for ($i = 0; $i < $count; $i++) {
    $unused = substr($content, $i, 1);
}
$timeend = microtime(true) - $timestart;
$diff = sprintf('%.3f', $timeend);
echo "substr brauchte " . $diff . " Sekunden um die Eingabe zeichenweise durchzugehen\n";



$content = str_repeat('ä', $__length);
$count   = mb_strlen($content);

$timestart = microtime(true);
for ($i = 0; $i < $count; $i++) {
    $unused = mb_substr($content, $i, 1);
}
$timeend = microtime(true) - $timestart;
$diff = sprintf('%.3f', $timeend);
echo "mb_substr brauchte " . $diff . " Sekunden um die Eingabe zeichenweise durchzugehen\n";

mb_substr braucht auf meinem Rechner mehr als 20-mal so lange wie substr. Das liegt daran, dass substr davon ausgehen kann, dass jedes Zeichen 1 Byte lang ist, während mb_substr je nach Zeichensatz analysieren muss, ob ein Zeichen möglicherweise mehrere Bytes umfasst. Das ist eine inhaltliche Sache, die ich als Programmierer im Zweifel einfach wissen muss, damit ich nicht zu falschen Schlüssen komme, denn mit mb_internal_encoding('ASCII'); sind beide Tests praktisch gleich schnell. Es liegt also nicht an der Funktion, sondern an den Rahmenbedingungen.
 
Es liegt also nicht an der Funktion, sondern an den Rahmenbedingungen.
Eben.

Das System ist halt nur so gut wie das Schwächste Glied der Kette, das kann dann auch schon mal am Server(Hoster) liegen.

Ein Wort noch zu Precompiled Patterns, das kann PHP nicht. Ist wohl eher was für Perl-Programme.
 
Danke, ja beim speed merkt man das doch sehr deutlich !
Deswegen versuch ich das grade anders zu lösen.

Bisher geht man auf die datei container.php und hier werden erst alle daten gesucht auf den anderen websiten .
Nun will ich es gleich so machen, wenn ein user was einträgt per formular , dass hier schon alle daten gehohlt werden
und in die DB geschreiben werden .
Denke dies ist eventuell etwas besser. Nicht viel aber immerhin etwas ...

Vl. werde ich hier heute nochmal was posten wenn ich fragen hab :) Hoffe das ist ok !
 
Zurück
Oben