1

私はウェブサイトからデータを収集する必要があるプロジェクトに取り組んでいるので、webharvest を使用しています。

収集しているデータ (ニュース Web サイトからのコメント) が複数のページにまたがっている場合があるという問題が発生しています。Webページのxpathでコメントの2ページ目へのリンクを探すように構成しようとしています。問題は、ifテストを試みると条件が常にパスし、tryステートメントを試みるとtry本体が常に成功することです。これにより、スクリプトは最初のページ (1 つしかない場合) からコメントを 2 回抽出します。ただし、2 組のコメントを含む記事は美しく機能します。したがって、私の質問はif条件とtryステートメントの構文に関連しています。これらの機能に関する Webharvest のドキュメントはほとんどありません。

これが私が試していることです。まず、ifテスト:

<var-def name="secondPageLink">
    <xpath expression="/a[@class='next']/@href">
        <var name="firstPage"/>
    </xpath>
</var-def>
<case>
    <if condition="${secondPageLink != null}">
        [ process second page ]
    </if>
</case>

次に、try/ catch:

<try>
    <body>
        <var-def name="secondPageLink">
            <xpath expression="/a[@class='next']/@href">
                <var name="firstPage"/>
            </xpath>
        </var-def>
        [ continue to process page ]
    </body>
    <catch>
    </catch>
</try>

テストの問題は、if2 番目のページが存在しないときに変数が空であるにもかかわらず (GUI のデバッグから確認できます)、 がiftrue を返し、その本体を実行するように見えることです。

値を返さない xpath (2 番目のページが存在しない場合) は「エラー」を構成せず、try は引き続き成功するため、 try/が適切に機能しない理由をより簡単に確認できます。catchさらに難しいのは、次のページ リンクの @href が相対的であるため、最初のページの URL (または実際には記事のベース URL ですが、ここでも同じこと) に追加する必要があることです。 -to-xml は ${firstPage}${secondPageLink} という URL を取得しますが、これは単に最初のページの URL になるだけなので、webharvest は最初のページをもう一度処理します。

ifsecondPageLink xpath が空の値を返したときに false を返すように誰かが私のテストを再定式化できるなら、私は非常に感謝しています!

4

1 に答える 1

1

答えが見つかりました。

この人物は で同様の問題を抱えておりif、そこでの回答では次の構文を使用することが提案されましたcondition="${variable.toString().length() > 0}"

ifしたがって、私のコードでは、テストを次のように置き換えます。

<case>
    <if condition="${secondPageLink.toString().length() > 0}">
        <var-def name="secondPageFull">
            <html-to-xml>
                <http url="${commentedArticleURL}${secondPageLink}"/>
            </html-to-xml>
[...]                   

正しい結果が得られました。

于 2014-07-17T03:40:31.200 に答える