This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
html parser elemente formatieren
#1
Moin,

ich benötige mal euren Rat. Ich habe mit der simple_html_dom lib einen Parser für Rezepte von chefkoch.de gebaut.
Um die Zutaten für meinen Bedarf zu verwenden benötige ich eine bestimmte Formatierung. Ich probiere schon eine ganze Weile rum, aber es funktioniert nicht so richtig.

Hier der Code:

include('simple_html_dom.php');
 
$html = file_get_html($_POST["recipe_url"]);

// ***************** parse ingredients **********
$ingreds_block = $html->find('table.[class=ingredients table-header]');

foreach($ingreds_block[0]->find('tr') as $row){
    $line_cut = strip_tags($row);
    $line_end = trim($line_cut).";";

    echo $line_end."<br>";
    
    //file_put_contents('../usr/'.$_SESSION['userid'].'/'.'ingred_list.txt', $line_end.PHP_EOL, FILE_APPEND | LOCK_EX);

}
// ******** end************

Das funktioniert soweit und erzeugt die Ausgabe je Zeile:

[Menge] [Einheit] [Bezeichung] [Bezeichnung] [Bezeichnung](n);

Was ich aber benötige ist:

[Menge],[Einheit],[Bezeichnung Bezeichnung Bezeichnung (n)];

Ein einfaches str_replace() funktioniert leider nicht, das sieht dann als Bsp. so aus:

800,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,g,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Tafelspitz,vom,Rind;
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Port.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Suppengemüse,(Lauch,,Sellerie,,Zwiebel,,Möhre);
3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Lorbeerblätter;
1,½,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Liter,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Gemüsebrühe,oder,Fleischbrühe;
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Gemüsezwiebel(n);
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,EL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Senf,,mittelscharfer;
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,EL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Butter;
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,EL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Mehl;
5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,cl,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Weinessig;
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,EL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Zucker;
Salz,und,Pfeffer;


Test URL: https://www.chefkoch.de/rezepte/80242118...eisch.html

Woher die vielen 'Leerzeichen' kommen, konnte ich bis jetzt nicht nachvollzeihen. Im DOM sieht man nichts davon.
Eine weitere foreach()-Aufsplittung war bis auch nicht erfolgreich.

Hat mir wer einen Tipp?

Vielen Dank!
Schwarzer Humor ist wie essen, hat nicht jeder.
Zitieren
#2
Moin BastiBln,
leider verwende ich dieses Modul/Extension garnicht. Aber ich habe eine Doku gefunden:
https://enb.iisd.org/_inc/simple_html_do...manual.htm

Ich hoffe es hilft dir weiter.
"Gerne dürft ihr mir eine gute Bewertung da lassen aber auch gegenüber Kritik bin ich offen" Angel
Als Lösung markieren Zitieren
#3
Hi,

danke. Das Manual ist mir bekannt. Leider kann man nicht kleinteiliger parsen, die Zutaten stehen im orig. html in nur einer Zeile (tr), die einzelnen Elemente stehen nicht nochmal in tags, td z.Bsp.

Ich denke ich müsste jede Zeile noch einmal in ein array aufsplitten und dann jede Zeile neu zusammensetzten. Leider fehlt mir noch die Vision wie man das am Dümmsten macht.
Schwarzer Humor ist wie essen, hat nicht jeder.
Als Lösung markieren Zitieren
#4
Hi BastiBln,
ich versuch mal mein Bestes und lese mich mal da ein. Hast du eventuell andere Methoden um den Inhalt zu lesen und bestimmte Elemente zu selektieren?

VG rzscout
BastiBln likes this post
"Gerne dürft ihr mir eine gute Bewertung da lassen aber auch gegenüber Kritik bin ich offen" Angel
Als Lösung markieren Zitieren
#5
Hi,

vielen Dank!

Nicht dass ich wüsste, parse libs funktionieren ja vermutlich alle gleich; man kann nach html-tags oder klassen selektieren. Leider hat die Darstellung der Zutatenliste bei chefkoch nur eine Klasse in table, danach kann man nur noch nach html-tags filtern/selektieren damit die Liste vollstänig ist.

VG

Hi,

alles Quatsch, hab eben nochmal geschaut, die td-tags haben doch eine eigene Klasse nach der man nochmal selektieren kann:

// ***************** parse ingredients **********
$ingreds_block = $html->find('table.[class=ingredients table-header]');

foreach($ingreds_block[0]->find('tr') as $row){
    $split = $row->find('td.[class=td-left]');
    $split_ = $row->find('td.[class=td-right]');
    $line_cut = strip_tags($split[0]);
    // $line_end = trim($line_cut).";";
    $line = str_replace(' ', ',', $line_cut);

    echo $line.$split_[0]."<br>";
    
    //file_put_contents('../usr/'.$_SESSION['userid'].'/'.'ingred_list.txt', $line_end.PHP_EOL, FILE_APPEND | LOCK_EX);

}
// ******** end************

Ausgabe:

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,800,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,g,,,,,,,,,,,,,,,,,,,,,,,,,,,, Tafelspitz vom Rind
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Port.,,,,,,,,,,,,,,,,,,,,,,,,,,,, Suppengemüse (Lauch, Sellerie, Zwiebel, Möhre)
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, Lorbeerblätter
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,½,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Liter,,,,,,,,,,,,,,,,,,,,,,,,,,,, Gemüsebrühe oder Fleischbrühe
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, Gemüsezwiebel(n)
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,EL,,,,,,,,,,,,,,,,,,,,,,,,,,,, Senf, mittelscharfer
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,EL,,,,,,,,,,,,,,,,,,,,,,,,,,,, Butter
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,EL,,,,,,,,,,,,,,,,,,,,,,,,,,,, Mehl
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,cl,,,,,,,,,,,,,,,,,,,,,,,,,,,, Weinessig
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,EL,,,,,,,,,,,,,,,,,,,,,,,,,,,, Zucker
Salz und Pfeffer


Jetzt müssen nur noch die vielen Kommata weg, dann passt es.
Schwarzer Humor ist wie essen, hat nicht jeder.
Als Lösung markieren Zitieren
#6
So, ich habs hinbekommen. Scheinbar hinterlässt strip_tags() jede Menge whitespaces, oder der parser.

So funktioniert es jetzt:

// ***************** parse ingredients **********
$ingreds_block = $html->find('table.[class=ingredients table-header]');

foreach($ingreds_block[0]->find('tr') as $row){
    $split_1 = $row->find('td.[class=td-left]');
    $split_2 = $row->find('td.[class=td-right]');
    $line_1 = strip_tags($split_1[0]);
    $line_fix = str_replace(' ', ',', trim($line_1));
    $line_cmpl = str_replace(',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', '', $line_fix);
    $rm_tags = strip_tags($split_2[0]);
    $name_cmpl = str_replace(',', '', $rm_tags);

    if(!empty($line_cmpl)){
        //echo $line_cmpl.",".trim($name_cmpl).";<br>";
        file_put_contents('../usr/'.$_SESSION['userid'].'/'.'ingred_list.txt', $line_cmpl.",".trim($name_cmpl).",,;".PHP_EOL, FILE_APPEND | LOCK_EX);
    }

}
// ******** end************
Schwarzer Humor ist wie essen, hat nicht jeder.
Als Lösung markieren Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste