1

HTML 解析用の PHP スクリプトしかなく、単純な Web サイトで動作しますが、この Web サイトからシネマ プログラムを解析する必要があります。私はfile_get_contents関数を使用しています.4つの改行区切り文字だけを返しますが、その\n理由がわかりません. プログラム自体は単なるポップアップ ウィンドウであり、URL アドレスを変更しないように見えるため、Web サイト自体を DOMDocument a XPath で解析するのはより困難になりますが、サイトの HTML コードを取得した後にこの問題を処理しようとします。 .

これが私のスクリプトの短縮版です:

<?php
      $url = "http://www.cinemacity.cz/";
      $content = file_get_contents($url);
      $dom = new DomDocument;
      $dom->loadHTML($content);

      if ($dom == FALSE) {
        echo "FAAAAIL\n";
      }

      $xpath = new DOMXPath($dom);

      $tags = $xpath->query("/html");

      foreach ($tags as $tag) {
        var_dump(trim($tag->nodeValue));
      }
?>

編集:

したがって、WBAR (ありがとう) のアドバイスに従って、file_get_contents() 関数のヘッダーを変更する方法を探していましたが、これが他の場所で見つけた答えです。これで、サイトの HTML を取得できるようになりました。うまくいけば、この混乱の解析を管理できます:D

<?php
    libxml_use_internal_errors(true);
    // Create a stream
    $opts = array(
      'http'=>array(
        'user_agent' => 'PHP libxml agent', //Wget 1.13.4
        'method'=>"GET",
        'header'=>"Accept-language: en\r\n" .
                  "Cookie: foo=bar\r\n"
      )
    );
    $context = stream_context_create($opts);

    // Open the file using the HTTP headers set above
    $content = file_get_contents('http://www.cinemacity.cz/', false, $context);

    $dom = new DomDocument;
    $dom->loadHTML($content);

    if ($dom == FALSE) {
        echo "FAAAAIL\n";
    }

    $xpath = new DOMXPath($dom);

    $tags = $xpath->query("/html");

    foreach ($tags as $tag) {
        var_dump(trim($tag->nodeValue));
    }
?>
4

2 に答える 2

4

問題は PHP ではなく、ターゲット ホストにあります。クライアントの User-Agent ヘッダーを検出します。これを見てください:

wget http://www.cinemacity.cz/
2012-10-07 13:54:39 (1,44 MB/s) - saved `index.html.1' [234908]

ただし、User-Agent ヘッダーを削除する場合:

wget --user-agent="" http://www.cinemacity.cz/
2012-10-07 13:55:41 (262 KB/s) - saved `index.html.2' [4/4]

サーバーから返されたのは 4 バイトのみでした

于 2012-10-07T11:57:44.877 に答える
0

この方法でコンテンツを取得してみてください。

  function get2url($url, $timeout = 30, $port = 80, $buffer = 128) {
    $arr = parse_url($url);
    if(count($arr) < 3) return "URL ERROR";

    $ssl = "";
    if($arr['scheme'] == "https") $ssl = "ssl://";

    $header  = "GET " . $arr['path'] . "?" . $arr['query'] . " HTTP/1.0\r\n";
    $header .= "Host: " . $arr['host'] . "\r\n";
    $header .= "\r\n";

    $f = @fsockopen($ssl . $arr['host'], $port, $errno, $errstr, $timeout);

    if(!$f)
      return $errstr . " (" . $errno . ")";

    else{
      @fputs($f, $header . $arr['query']);

      $echo = "";
      while(!feof($f)) { $echo .= @fgets($f, $buffer); }

      @fclose($f);

      return $echo;
    }
  }

ただし、ヘッダーを削除する必要があります。

于 2012-10-07T11:52:11.527 に答える