-1

このサイトからいくつかのデータをスクレイピングしようとしています: http://laperuanavegana.wordpress.com/ . 実は、レシピと材料のタイトルが欲しいのです。成分は 2 つの特定のキーワード内にあります。正規表現と simplehtmldom を使用してこのデータを取得しようとしています。しかし、成分だけでなく完全なhtmlテキストを表示しています。ここに私のコードがあります: <?php

include_once('simple_html_dom.php');
$base_url = "http://laperuanavegana.wordpress.com/";

traverse($base_url);


function traverse($base_url)
{
    
    $html = file_get_html($base_url);
    $k1="Ingredientes";
    $k2="Preparación";
    preg_match_all("/$k1(.*)$k2/s",$html->innertext,$out);
    echo $out[0][0];
}

?>

このページには複数の成分があります。私はそれらのすべてが欲しい。preg_match_all() を使用すると、誰かがこのコードのバグを検出した場合に役立ちます。前もって感謝します。

4

2 に答える 2

4

すでに HTML パーサーを使用している場合 (SimpleHtmlDom のような貧弱なパーサーであっても)、なぜ正規表現で混乱させようとするのでしょうか? それはメスを使って患者の体を開き、実際の手術では鋭利なスプーンに戻るようなものです。

SimpleHtmlDom はコードベースが貧弱であり、libxml ベースのパーサーよりもはるかに遅いため、誰も使用すべきではないと強く信じているため、PHP のネイティブ DOM 拡張機能XPathを使用してそれを行う方法を次に示します。XPath は事実上、X(HT)ML ドキュメントの正規表現または SQL です。それを学べば、二度と HTML の正規表現に触れる必要がなくなります。

$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTMLFile('https://laperuanavegana.wordpress.com/2011/06/11/ensalada-tibia-de-quinua-mango-y-tomate/');
libxml_clear_errors();

$recipe = array();
$xpath = new DOMXPath($dom);
$contentDiv = $dom->getElementById('content');
$recipe['title'] = $xpath->evaluate('string(div/h2/a)', $contentDiv);
foreach ($xpath->query('div/div/ul/li', $contentDiv) as $listNode) {
    $recipe['ingredients'][] = $listNode->nodeValue;
}
print_r($recipe);

これは出力されます:

Array
(
    [title] => Ensalada tibia de quinua, mango y tomate
    [ingredients] => Array
        (
            [0] => 250gr de quinua cocida tibia
            [1] => 1 mango grande
            [2] => 2 tomates
            [3] => Unas hojas de perejil
            [4] => Sal
            [5] => Aceite de oliva
            [6] => Vinagre balsámico
        )

)

解析しているのではなくhttp://laperuanavegana.wordpress.com/、実際のブログ投稿であることに注意してください。ブログの所有者が新しい投稿を追加するたびに、メイン URL のコンテンツが変更されます。

メインページからすべてのレシピを取得するには、次を使用できます

$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTMLFile('https://laperuanavegana.wordpress.com');
libxml_clear_errors();
$contentDiv = $dom->getElementById('content');
$xp = new DOMXPath($dom);
$recipes = array();
foreach ($xp->query('div/h2/a|div/div/ul/li', $contentDiv) as $node) {
    echo
        ($node->nodeName === 'a') ? "\n# " : '- ',
        $node->nodeValue,
        PHP_EOL;
}

これは出力されます

# Ensalada tibia de quinua, mango y tomate
- 250gr de quinua cocida tibia
- 1 mango grande
- 2 tomates
- Unas hojas de perejil
- Sal
- Aceite de oliva
- Vinagre balsámico

# Flan de lúcuma
- 1 lúcuma grandota o 3 pequeñas
- 1/2 litro de leche de soja evaporada
…

等々

こちらもご覧ください

于 2011-08-13T16:09:58.473 に答える
3

そこに疑問符を追加する必要があります。それはパターンを貪欲にしない - そうしないと、ページの最初の $k1 から最後の $k2 までのすべてを取得します。疑問符を追加すると、常に次の $k2 がかかります。

preg_match_all("/$k1(.*?)$k2/s",$html->innertext,$out);
于 2011-08-13T15:51:19.147 に答える