0

Web ハーベストを使用して e コマース サイトをスクラップしています。検索ページを反復処理して、出力 xml で各製品の詳細を取得しています。文字列.つまり、

let $linktoprod :=data($item//a[@class="fk-anchor-link"]/@href)

上記の行は、各製品のアンカー タグの href 値を返します。つまり、最初の製品の場合、返される値は次のとおりです。

/casio-sheen-analog-watch-women/p/itmdaqmvzyy23hz5?pid=WATDAQMVVNQEM9CX&ref=6df83d8f-f61f-4648-b846-403938ae92fa

/([^/\?]+)\? のような正規表現を使いたいと思います。最後の / と ? の間の文字列を取得します。つまり、

itmdaqmvzyy23hz5

出力xmlで。これについて何か考えがある人は誰でも助けてください。ありがとうございました。

更新しました -

  <?xml version="1.0" encoding="UTF-8"?>

<config charset="ISO-8859-1">

<function name="download-multipage-list">
        <return>
            <while condition="${pageUrl.toString().length() != 0}" maxloops="${maxloops}" index="i">
                <empty>
                    <var-def name="content">
                        <html-to-xml>
                            <http url="${pageUrl}"/>
                        </html-to-xml>
                    </var-def>

                    <var-def name="nextLinkUrl">
                        <xpath expression="${nextXPath}">
                            <var name="content"/>
                        </xpath>
                    </var-def>

                    <var-def name="pageUrl">
                        <template>${sys.fullUrl(pageUrl.toString(), nextLinkUrl.toString())}</template>
                    </var-def>
                </empty>

                <xpath expression="${itemXPath}">
                 <var name="content"/>  
                </xpath>
            </while>
        </return>
    </function>

    <var-def name="products">          
        <call name="download-multipage-list">
                 <call-param name="pageUrl">http://www.flipkart.com/watches/pr?sid=reh%2Cr18</call-param>  
                 <call-param name="nextXPath">//a[starts-with(., 'Next')]/@href</call-param>
         <call-param name="itemXPath">//div[@class="product browse-product "]</call-param>
         <call-param name="pids"></call-param>
            <call-param name="maxloops">5</call-param>
         </call>

    </var-def>
   <var-def name="scrappedContent"> 
    <!-- iterates over all collected products and extract desired data -->

    <![CDATA[ <catalog> ]]> 

        <loop item="item" index="i">
            <list><var name="products"/></list>
            <body>
            <xquery>
                    <xq-param name="item" type="node()"><var name="item"/></xq-param>
                    <xq-expression><![CDATA[
                            declare variable $item as node() external;

                    let $linktoprod :=data($item//a[@class="fk-anchor-link"]/@href)
                  let $name := data($item//div[@class="title"])

                      return
                      <product>
                      <link>{$linktoprod}</link>
                    <title>{normalize-space($name)}</title>

                     </product>
                    ]]></xq-expression>
                </xquery>

            </body>
        </loop>
        <![CDATA[ </catalog> ]]>

 </var-def>  
</config>

私の構成 xml は上記のとおりです。私の xml で正規表現コード ブロックを使用する場所は? そして、正規表現をlinktoprodに適用し、最終的にリンクタグの正規表現出力を出力xmlとして取得したい.誰かが私を案内してください. ありがとうございました。

4

2 に答える 2

1

Web ハーベストについてはわかりませんが、貪欲でない量指定子をサポートしている場合は、このパターンを使用できます

/([^/]+?)\?

Web Harvest User manual - regexpによると、次のようなものを挿入する必要があります

<regexp>
    <regexp-pattern>/([^/]+?)\?</regexp-pattern>
    <regexp-source>
        /casio-sheen-analog-watch-women/p/itmdaqmvzyy23hz5?pid=WATDAQMVVNQEM9CX&amp;ref=6df83d8f-f61f-4648-b846-403938ae92fa
    </regexp-source>
    <regexp-result>
        <template>Last URL part is "${_1}"</template>
    </regexp-result>
</regexp>

この<regexp-source>部分には、検索する URL または変数を挿入する必要があります。マニュアルと構成xmlから推測すると、次のようなものかもしれません

<regexp-source>
    <var>scrappedContent</var>
</regexp-source>

また

<regexp-source>
    ${linktoprod}
</regexp-source>

少し実験する必要があると思います。

于 2013-01-07T08:37:28.357 に答える
0

この正規表現を試してください:

/([^/]+)\?

/先頭と末尾の を削除する必要がある場合があります?

正規表現が機能することを示すために、これは JavaScript での結果です。

var s = "/casio-sheen-analog-watch-women/p/itmdaqmvzyy23hz5?pid=WATDAQMVVNQEM9CX&amp;ref=6df83d8f-f61f-4648-b846-403938ae92fa"
console.log(s.match(/\/([^/]+)\?/g)); //  /itmdaqmvzyy23hz5?
于 2013-01-07T08:39:11.000 に答える