0

ColdFusion で Web スクレイピングを行っていますが、ほとんどすべてが正常に機能しています。私が得ている他の唯一の問題は、一部の URL の背後にテキストが含まれているため、現在エラーが発生していることです。

何が原因かはわかりませんが、おそらく私の正規表現です。とにかく、"http://" の前にテキストが表示される明確なパターンがあります。その前のすべてを単純に削除したいと思います。

あなたが助けることができる可能性はありますか?

たとえば、次の文字列を使用します。

"I'M OBSESSED WITH MY BEAUTIFUL FRIEND" src="http://scs.viceland.com/feed/images/uk_970014338_300.jpg

正規表現は私が時間を割くことができなかったので、あなたの助けに感謝します-願わくばいつの日か!

ありがとう。

編集:

やあ、

問題を引き起こしているのは最初の REGEX である可能性があるため、関数全体を投稿すると役立つと思いました。基本的に、この関数は 1 つの引数を取ります。この場合、それは (CFHTTP 経由の) HTML ファイルの内容です。

場合によっては、すべての URL が正常に表示され、機能します。たとえば、digg.com を試してみると動作しますが、youtube.com のようなものでは動作しません。これは、特定の HTML フォーマットにかかっていると思います。いずれにせよ、必要なのはイメージ タグの SRC 属性の値だけです。

これが私がこれまでに持っているものです:

<cffunction name="extractImages" returntype="array" output="false" access="public" displayname="extractImages">

        <cfargument name="fileContent" type="string" />

        <cfset var local = {} />
        <cfset local.images = [] />
        <cfset local.imagePaths = [] />
        <cfset local.temp = [] />

        <cfset local.images = reMatchNoCase("<img([^>]*[^/]?)>", arguments.fileContent) /> 

        <cfloop array="#local.images#" index="local.i">

            <cfset local.temp = reMatchNoCase("(""|')(.*)(gif|jpg|jpeg|png)", local.i) /> 

            <cfset local.path = local.temp />

            <cfif not arrayIsEmpty(local.path)>
                <cfset local.path = trim(replace(local.temp[1],"""","","all")) />
                <cfset arrayAppend(local.imagePaths, local.path) />
            </cfif>

            <cfif isValid("url", local.path)>

                <cftry>

                    <cfif fileExists(local.path)>
                        <cfset arrayAppend(local.imagePaths, local.path) /> 
                    </cfif>

                    <cfcatch type="any">
                        <cfset application.messagesObject.addMessage("error","We were not able to obtain all available images on this page.") />
                    </cfcatch>

                </cftry>

            </cfif>

        </cfloop>

        <cfset local.imagePaths = application.udfObject.removeArrayDuplicates(local.imagePaths) />

        <cfreturn local.imagePaths />

    </cffunction>

この機能は動作します。ただし、一部のサイトではそうではありません。それは少し上に見えますが、その多くは、有効な画像パスを確実に取得するための特定の保護手段です。

お役に立てれば幸いです。

どうもありがとうございました。マイケル

4

2 に答える 2

4

ReFind() または REFindNoCase() を見てください - http://cfquickdocs.com/cf9/#refindnocase

これが機能する正規表現です。

<cfset string = 'IM OBSESSED WITH MY BEAUTIFUL FRIEND" src="http://scs.viceland.com/feed/images/uk_970014338_300.jpg' />

<cfdump var="#refindNoCase('https?://[-\w.]+(:\d+)?(/([\w/_.]*)?)?',string, 1, true)#">

POS および LEN キーで返された構造体が表示されます。POS 配列の最初の要素を使用して試合の開始位置を確認し、LEN 配列の最初の要素を使用して試合の長さを確認します。これらの値を Mid() 関数で使用して、一致する URL だけを取得できます。

于 2011-06-17T22:15:14.177 に答える
1

私は ColdFusion に詳しくありませんが、http://、任意の数の文字、文字列の末尾を検索する正規表現が必要なだけのように思えます。

于 2011-06-17T22:01:52.173 に答える