Jak wyciągnąć dataset <div> z treści scrapowanej strony wyrażeniami regularnymi?

0

Cześć, potrzebuje wyciągnąć dane ze strony z kodu HTML. Próbuje użyć wyrażeń regularnych, tak czytałem, że nie służą do parsowania HTML, dlatego tu moje pytanie. Czy w taki sposób jak napisałem można wyciągnąć wartość data-v-08ffb7ec, która później będzie mi potrzebna do wyszukiwania innych danych w kodzie? Nie do końca wiem czy zrozumiałem zamysł funkcji preg_match().

<?php
$file = fopen("page.php", "w");   
$c = curl_init();
curl_setopt($c, CURLOPT_URL, "https://www.meczyki.pl/wyniki-na-zywo/crystal-palace-manchester-city/3450528.html");
curl_setopt($c, CURLOPT_FILE, $file); 
curl_exec($c);
$openFile = file_get_contents('page.php');

//<div class="stats-row-left" data-v-08ffb7ec

// $content = '/(<div class="stats-row-middle" data-v-)\w+\s(data-v-)\w+(>Strzały<)/'; // Strzały

$content2 = '/(<div class="stats-row-middle" data-v-)\w+/';

if (preg_match_all($content2, $openFile, $matches)){
	print_r($matches)."\n";			 
} else {
	print "nie ma";
}
curl_close($c);
fclose($file);
?>

4
R1D3Rekk napisał(a):

Cześć, potrzebuje wyciągnąć dane ze strony z kodu HTML. Próbuje użyć wyrażeń regularnych, tak czytałem, że nie służą do parsowania HTML, dlatego tu moje pytanie.

No to skoro znalazłeś informacje o tym, że nie parsuje się HTML'a regexpami, to czemu uparcie próbujesz to zrobić?

Użyj do tego odpowiedniego parsera HTML:

R1D3Rekk napisał(a):

Bardziej jakieś informacje o tym, że nie do tego jest stworzony ale czy bezwzględnie się do tego nie nadaje? Chce tylko wyciągnąć tą wartość diva

Myślę, że jesteś w ogromnym błędzie. Wmawiasz sobie "tylko wyciągnąć wartość z diva", ale to co tak na prawdę próbujesz zrobić to sparsować HTML'a regexpami, co jest bardzo złym pomysłem. Nie wiesz jak to zrobić poprawnie, więc tłumaczysz to sobie mówiąć "tylko jeden div". Ale potem, jak będziesz rozwijał swój program to potem będzie drugi div, potem trzeci, i potem zakopiesz się w wielkie szambo regexpów do HTML'i. To jest bardzo zły pomysł.

Jak poprawnie sparsować HTML

$openFile = file_get_contents('page.php');

//<div class="stats-row-left" data-v-08ffb7ec

$document = new \DomDocument();
@$document->loadHTML($openFile);
$xPath = new \DOMXpath($document);
$elements = $xPath->query("//div[@class='stats-row-middle']");

/**
 * @var DOMNodeList|false $elements
 */
if ($elements === false) {
    throw new Exception("Malformed xPath selector");
}

/**
 * @var DOMElement $element
 */
foreach ($elements as $element) {
    $element->childNodes;  // dzieci taga
    $element->tagName;     // nazwa taga
    $element->textContent; // treść tekstowa

    if ($element->hasAttribute('data-v-08ffb7ec')) {
        var_dump($element->getAttribute('data-v-08ffb7ec'));
    }

    foreach ($element->attributes as $attribute) {
        var_dump($attribute->name);
        var_dump($attribute->value);
    }
}

4

Wydaje mi się, że już raz pisałem Ci żebyś użył o ile to możliwe DomDocument. Musisz jednak znaleźć jednoznaczną wskazówkę co wyciągać. Skoro klasa i id się zmienia.

2
jurek1980 napisał(a):

Wydaje mi się, że już raz pisałem Ci żebyś użył o ile to możliwe DomDocument. Musisz jednak znaleźć jednoznaczną wskazówkę co wyciągać. Skoro klasa i id się zmienia.

No to jeśli faktycznie to co @R1D3Rekk chce wyciągać się zmienia, to tymbardziej wyciąganie tego regexpami nie ma sensu - jeszcze mniej niż wcześniej.

1

Skoro to jest wynik jakiegoś meczu, to czemu nie skorzystasz z jakiegoś API? Wolałbym zapłacić jakieś pieniądze i mieć stabilne dane, niż spędzić tydzień czasu na parsowaniu strony, która zmieni się za dwa tygodnie. Albo może sama strona meczyki.pl ma jakieś API?

2
R1D3Rekk napisał(a):

Cześć, potrzebuje wyciągnąć dane ze strony z kodu HTML. Próbuje użyć wyrażeń regularnych, tak czytałem, że nie służą do parsowania HTML, dlatego tu moje pytanie. Czy w taki sposób jak napisałem można wyciągnąć wartość data-v-08ffb7ec, która później będzie mi potrzebna do wyszukiwania innych danych w kodzie? Nie do końca wiem czy zrozumiałem zamysł funkcji preg_match().

<?php
$file = fopen("page.php", "w");   
$c = curl_init();
curl_setopt($c, CURLOPT_URL, "https://www.meczyki.pl/wyniki-na-zywo/crystal-palace-manchester-city/3450528.html");
curl_setopt($c, CURLOPT_FILE, $file); 
curl_exec($c);
$openFile = file_get_contents('page.php');

//<div class="stats-row-left" data-v-08ffb7ec

// $content = '/(<div class="stats-row-middle" data-v-)\w+\s(data-v-)\w+(>Strzały<)/'; // Strzały

$content2 = '/(<div class="stats-row-middle" data-v-)\w+/';

if (preg_match_all($content2, $openFile, $matches)){
	print_r($matches)."\n";			 
} else {
	print "nie ma";
}
curl_close($c);
fclose($file);
?>

Taka rada - raczej nie korzystaj z zamykającego ?> (chyba że robisz plik który w całości się składa z HTML'a). Jak się zastanowisz, to zauważysz że tak na prawdę ?> to jest to samo co echo.

1 użytkowników online, w tym zalogowanych: 0, gości: 1