0

正規表現を使用して Web サイトからデータを抽出する方法を学び始めたばかりです。私の最初の目標は、Web サイトのタイトルを抽出することです。これが私のコードのようなものです:

<?php 
    $data = file_get_contents('http://bctia.org');
    $regex = '/<title>(.+?)<\/title>/';
    preg_match($regex,$data,$match);
    var_dump($match); 
?>

var_dump の結果は空です:

array(0) { }

最初は「bctia.orgにタイトルがないのかな?」と思いました。ただし、bctia.org のソースを確認したところ、~<title></title>.

それから、私のコードが機能しないのではないかと思いました。ただし、これも当てはまりません。たとえば、 、または などbctia.orgの他の Web サイトに置き換えたところ、どちらも正しい結果を返しました。たとえば、正しい結果が得られますbing.comapple.comapple.com

array(2) { [0]=> string(20) "" [1]=> string(5) "Apple" }

bctia.orgそのため、タイトルを抽出できない非常に特別なウェブサイトであるという結論に達しなければなりません...

本当にそうなのか気になりますよね?または、私のコードに私が特定していない問題があるのでしょうか?

前もって感謝します!

4

3 に答える 3

3

この特定の Web サイトのサーバー側コードは、クライアントがヘッダーを送信することを前提としていますがUser-Agent、明らかに、PHP インストールはヘッダーを送信するように構成されていません。したがって、 a500 Internal Server Errorが返され、file_get_contentsreturn が発生しfalseます。

Source Error:
Line 66: //LOAD: Compatibility Mode
Line 67: //<meta http-equiv="X-UA-Compatible" content="IE=7,IE=9" />
Line 68: string BrowserOS = Request.ServerVariables["HTTP_USER_AGENT"].ToString();
Line 69: HtmlMeta compMode = new HtmlMeta();
Line 70: compMode.Content = "IE=7,IE=9";


Source File: c:\inetpub\wwwroot\BCTIA\Website\bctia\layouts\Main Layout.aspx.cs   
Line: 68

Stack Trace:
[NullReferenceException: Object reference not set to an instance of an object.]
   Layouts.Main_Layout.Page_Load(Object sender, EventArgs e) in c:\inetpub\wwwroot\BCTIA\Website\bctia\layouts\Main Layout.aspx.cs:68
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +24
   System.Web.UI.Control.LoadRecursive() +70
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3063

この問題を回避するには、リクエストを行う前にユーザー エージェント文字列を設定します。

ini_set('user_agent', 'Mozilla/5.0 (compatible; Examplebot/0.1; +http://www.example.com/bot.html)');
于 2013-06-12T00:56:03.513 に答える
0

正規表現を使用しないでください.. !!

代わりに xpath を使用してください: xpath

正規表現はうまく機能しません。

于 2013-06-12T00:15:54.923 に答える
0

正規表現を使用して html コードを解析するのは良い方法ではありません。

パターンが機能しない理由は、ドットが改行と一致しないためです。

ドットを改行に一致させたい場合は、パターンの最後に s 修飾子を使用するか、ドットを使用しないでください。

$regex = '/<title>(.+?)<\/title>/s';

また

$regex = '/<title>([^<]+)<\/title>/';

[^<]はすべての文字を含む文字クラスですが<、おわかりのように、遅延量指定子を使用する必要はありません+:+?

于 2013-06-12T00:17:48.163 に答える