2

だから私のスクレイピープロジェクトでは、いくつかの特定のフィールドを分離することができました。フィールドの1つは次のようなものを返します:

[Rank Info] on 2013-06-27 14:26 Read 174 Times

式によって選択されたもの:

(//td[@class="show_content"]/text())[4]

私は通常、日時情報を抽出するために後処理を行います。つまり、2013-06-27 14:26xpath 部分文字列操作についてもう少し学習したので、そもそもその情報を抽出することさえ可能かどうか疑問に思っています。つまり、 xpath式自体で?

ありがとう、

4

3 に答える 3

3

これまでの他のすべての回答では、役に立たないだけでなく/text()、潜在的な(または可能性の高い)問題です。/text()アーカイブの読者は、関数の引数に in アドレスを使用する際の問題に注意する必要があります。text()私の専門的な仕事では、直接アドレス指定するための要件は非常に (非常に!) ありません。

私は他の投稿からこれらの表現について話している:

substring-after(//td[@class='show_content']/text(), 'on ')

substring(//td[@class='show_content']/text(), 16, 10)

「//」が使用されるべきではない場合に使用されるという問題は脇に置きましょう。XSLT 1.0 では、最初の引数のみ<td>が考慮され、XSLT 2.0 では、最初の引数の複数のシングルトンによって実行時エラーがトリガーされます。

入力である場合は、次の変更された XML を検討してください。

   <td>[<emphasis>Rank Info</emphasis>] on 2013-06-27 14:26 Read 174 Times</td>

... " on " は 2 番目のテキスト ノードにあります (最初のテキスト ノードには "[" が含まれています)。XSLT 1.0 では、どちらの式も空の文字列を返します。XSLT 2.0 では、両方の式が実行時エラーを引き起こします。

入力である場合は、次の変更された XML を検討してください。

   <td>[Rank Info]<emphasis> on </emphasis>2013-06-27 14:26 Read 174 Times</td>

どちらの場合も、 のtext()子に<td>は文字列「on」が含まれません。これは、子テキスト ノードではなく、子孫テキスト ノードであるためです。

両方の式で、テキスト ノードの値ではなく要素の値を処理するため、次の式は変更された両方の入力に対して機能します。要素の値は、すべての子孫テキスト ノードの連結です。

そう:

substring-after(td[@class='show_content'], 'on ')

substring(td[@class='show_content'], 16, 10)

要素で見つかった文字列値全体に作用します。しかし、上記でも複数の<td>子が存在する場合はカーディナリティの問題が発生するため、とにかく式を書き直す必要があります。

要点は、 の使用がtext()私の目に留まりtext()、XPath 式で使用する必要があると考えている場合は、ほとんどの場合そうではないため、再考する必要があることを学生に伝えます。

于 2013-06-29T00:31:36.163 に答える
1

これはうまくいくはずです

substring(//td[@class="show_content"]/text(), 16, 10)

しかし、私は Blender に同意します。この目的には、コード内の後処理の方が適しています。

于 2013-06-28T22:19:41.413 に答える
1

Scrapy は XPath 1.0 を使用しますが、これは文字列操作機能が非常に制限されており、特に正規表現をサポートしていません。文字列を切り詰めるには 2 つの方法があります。探している部分文字列に切り詰める例を示して、両方を示します。

文字インデックス別

文字インデックスが変更されない場合 (ただし、内容は変更される可能性があります)、これは問題ありません。

substring($string, $start, $len)
substring(//td[@class="show_content"]/text(), 16, 16)

プレ/サフィックス検索

インデックスが変更できる場合はこれで問題ありませんが、文字列の直前と直後の内容は同じままです。

substring-before($string, $needle)
substring-after($string, $needle)
substring-before(
  substring-after(//td[@class="show_content"]/text(), 'on '), ' Read')
于 2013-06-28T22:22:05.540 に答える