Autor Zpráva
eurolike
Profil
Nazdaar,

mám problém s phpčkem. Potřebuju vyparsovat data z html stránky - konkrétně adresy na články ze zpravodajství mvcr.cz

Otevřu si tedy soubor a kod načtu do velkýho řetězce :
$nactiweb = join ('', file ('http://www.mvcr.cz/rs_atlantic/project/section.php?ids=314'));

Jednotlivé adresy článků jsou v divech, ktere maji class s nazvem policie - začnu tedy procházet stránku:
$parser = strstr($nactiweb, '<div class="policie">');

Vzhledem k tomu, že adresa nezačíná ihned za divem, ale je tam taky pár dalších html znaků - jednoduše ten text ořežu:
$parser = substr($parser, 43, 20); // timto ziskam adresu ve tvaru article.php?id=15205 - tedy přesně tak, jak potřebuju

Problém tkví ale v tom, že těch adres je na stránce 15 - můžete mi prodadit nějaký cyklus, který by postupně prošel celou stránku a vypsal podobnym způsobem jako v předchozí ukázce všechny adresy na články ?

Předem díky za odpověď.
djlj
Profil
preg_match_all
eurolike
Profil
můžeš prosím uvést konkrétní příklad, jak by to šlo udělat ? funkci preg_match_all používám bohužel prvně :(
eurolike
Profil
Na jednom něměckym foru jsem našel tuhle aplikaci, která by měla projít web a najít tam všechny odkazy:


<?php

// <a href="http://www.php-resource.de/forum/showthread.php?s=&threadid=6952 4" target="_blank">http://www.php-resource.de/forum/sh...&threadid=69524< /a>

echo "<html>
<head>
<title>Linkfinder</title>
</head>

<body>";

if (isset($HTTP_POST_VARS['link'])) {
$html = file_get_contents($HTTP_POST_VARS['link']);
preg_match_all("/<a.*</a>/iU", $html, $matches);
shuffle($matches[0]);
preg_match("/<a.*?href=(\"|'|)([^(\"|'|>| )]*)(\"|'|| )[^>]*>([^<]*)</a>/is", $matches[0][0], $matches1);
echo "Zuf&auml;lliger Link:<br>
".$matches1[2]."<br>
<br>";
}

echo "<form action='".$PHP_SELF."' method='post'>
<h2>Linkfinder mit Zufallsprinzip</h2>
<br>
<input type='text' name='link' value='".$HTTP_POST_VARS['link']."'><br>
<br>
<input type='submit' name='sumbit' value='Durchsuchen'>
</form>
</body>
</html>";

?>

ale bohužel to nefunguje :(

hlásí to:

Warning: preg_match_all() [function.preg-match-all]: Unknown modifier 'a' in C:\Documents and Settings\Jirka\Dokumenty\webprojekty\pokus\help.php on line 15

Warning: shuffle() expects parameter 1 to be array, null given in C:\Documents and Settings\Jirka\Dokumenty\webprojekty\pokus\help.php on line 16

Warning: preg_match() [function.preg-match]: Unknown modifier 'a' in C:\Documents and Settings\Jirka\Dokumenty\webprojekty\pokus\help.php on line 17
tiso
Profil

for($i=0;$i<=16000;$i++){
echo 'article.php?id='.$i.'<br>';
}

...a máš ich koľko len chceš...
hw3
Profil
eurolike
Možná by to šlo "rozebrat" jako XML.
+ zde je pěkný článek o XML
anonym
Profil *
jak jak se to mohlo stát proč to prasklo proč!!!! ten bude platit jak mourovatej mam zkaženej život je mi 18 a sem držka světa
tiso
Profil
anonym
Spamuj si na svojom kompe a nie v tejto diskusii... Daj si odchod...
djlj
Profil
Unknown modifier 'a'
No ten regulární výraz je napsanej špatně, místo </a> tam má být <\/a> (u obou dvou).
anode
Profil
<?php
$contents = file_get_contents('http://www.mvcr.cz/rs_atlantic/project/section.php? ids=314');
$re = '~<div class="policie">.*href="([^"]+)"~Us';
$matches = array();
preg_match_all($re,$contents,$matches);
print_r($matches[1]);
?>
eurolike
Profil
anode: woow :) díkys moc - jsi borec :)
eurolike
Profil
a ještě jedna věc - teda pokud můžu vopruzovat :)

nechá se podobnym způsobem vyparsovat i obsah článku z http://www.mvcr.cz/rs_atlantic/project/article.php?id=15327

jde mi o to, aby tam byl nadpis, krátkej úvod, kterej je tučně a samotnej text.

Kdo mi poradí, dostane bonbon :)
eurolike
Profil
jinak samozřejmě díkes všem za rady
anode
Profil
No tak to už je jednoduchý ne? Prostě chytneš text mezi <h3 style="font-size:125%"> a </h3> - to máš nadpis - pak text mezi <b><i> a </i></b>, to je úvod, no a nakonec od <br> do </div> je obsah článku. Jednoduché použití preg_match().
eurolike
Profil
jasňačka - problém je s tim sestavenim regulárního výrazu. Tohle je pro mě fakticky španělská vesnice - ale musim říct, že fce preg_match() je dotažená do dokonalosti. Se svym způsobem parsování bych potřeboval desítky řádků kodu - takhle je to v pěti řádcích.
eurolike
Profil
já teda nevim, jestli jsem to dobře pochopil - ale můžu teda třeba pro parsování nadpisu použít toto ?

$contents = file_get_contents('http://www.mvcr.cz/rs_atlantic/project/article.php? id=15660');
$re = '/(<h3[^>]*>.*?<\/h3>)/mi';
$matches = array();
preg_match_all($re,$contents,$matches);
print_r($matches[1][3]);
anode
Profil
eurolike: jo, dá se to takto, jenom nemusíš používat v tomto případě zbytečný preg_match_all(), ale vystačíš si s jednoduchým preg_match() :
$re = '/<h3[^>]*>.*?<\/h3>/si';
$matches = array();
preg_match($re, $contents, $matches);
echo $matches[0];

musíš použít modifikátor "s", aby tečka odpovídala i případnému přechodu na další řádek, naopak modifikátor "m" je zde zbytečný. Uzávorkování v regulárním výrazu můžeš s výhodou použít pro vybrání konkrétní části porovnávaného řetězce, např. při použití výrazu:
$re = '/<h3[^>]*>(.*?)<\/h3>/si';
budeš mít v $matches[1] přímo čistý text nadpisu
eurolike
Profil
parádička :) mě se teď třeba osvědčilo toto:
$nadpis = '/<h3 style="font-size:125%">(.*)<\/h3>/i';
Zatim to fungovalo v pohodě :)
eurolike
Profil
heh :) a třeba toto bymě zajímalo - když si udělám parsování počasí z centrumu.cz - někde se mi po cestě ztratí diakritika

<?php

$contents = file_get_contents('http://pocasi.aktualne.centrum.cz/');

$re = '/<tr class="home-text">(.*?)<\/tr>/si';
$matches = array();
preg_match($re, $contents, $matches);

$dily = explode("<br><br>", $matches[0]);

$zitra = ltrim(rtrim(strip_tags($dily[0])));
$dalsi = ltrim(rtrim(strip_tags($dily[1])));

echo $zitra . "<BR /><BR />" . $dalsi;

?>

jak je to možný :) ?
eurolike
Profil
ha ... takže je to zřejmě jinym kodováním :) na stránkách mvcr, ze který jsem tahal ty články je kodování nastavený na windows-1250 (tam je to v poho s diakritikou), na centrumu používaj iso8859-2 a tam to už nefachčí. podivné ....
Toto téma je uzamčeno. Odpověď nelze zaslat.

0