3

これは素晴らしいサイトで、他の投稿をスクロールして検索するだけで、すでに多くの質問に答えています. 残念ながら、この問題に特に役立つ答えを突き止めることはできないようです。投稿して助けを探してみようと思いました-

ImportXML と Google スプレッドシートを使用して、小売サイトからいくつかの製品説明を「スクレイピング」しています。ほとんどの部分でうまく機能しており、私は2つの方法でそれを行いました:

1) 投稿の説明部分への特定の呼び出し:

=ImportXML(A1,"//div[@class='desc']")

2) 「製品カード」全体を呼び出します。これにより、製品のタイトル、価格、投稿された時間などの情報も返され、これらのアイテムが Google スプレッドシートの隣接するセルに配置されます。

=ImportXML(A1,"//div[@class='productCard']")

どちらも問題なく動作しましたが、それぞれの方法を使用して別の問題に遭遇しました。これらの問題の 1 つでも解決できれば、喜んでもう 1 つの方法を破棄します。そのうちの 1 つが機能するだけでよいのです。問題は次のとおりです。

方法 1) この Web サイトでは、売り手が商品の投稿に連絡先情報を含めることを禁止しています。いずれにせよ電子メール アドレスが含まれている場合、サイトは自動的にそれをブロックするため、投稿では単に「... you can contact me at [obscured ]」とかそんな感じ。[obscured] は異なる色のテキストで表示され、何らかの方法で明らかに異なる方法で処理されます。方法 1 を使用してこれらの説明をスクレイピングすると、[obscured] という単語にヒットすると ImportXML が「ぶつかった」ように見え、その製品説明の残りのテキストがスプレッドシートの次のセルに渡されます。これにより、シートの構成全体が台無しになります。ImportXML で [obscured] を無視して、製品説明のテキスト全体を 1 つのセルに配置できる方法を見つけたいと思います。

方法 2) 「製品カード」全体に対する私の呼び出しは次のとおりです。

=ImportXML(A1,"//div[@class='productCard']")

前述のように、これは (ほとんどの製品で) 正常に機能し、隣接するセルに追加情報 (価格、日付など) が表示されても問題ありません。ただし、この Web サイトでは、特定の製品を「特集」することもできます。この場合、サイトの別のカラー ボックスに表示されるため、購入者の注意を引く可能性が高くなります。この方法を使用すると、「注目の」製品がスクレイピングされたり、スプレッドシートにインポートされたりするのではなく、単に渡されます。

説明 (方法 1) と製品カード (方法 2) のソース コード (実際のサイト) (Safari の「要素を検査」経由) は次のようになります (通常の製品 (a) と注目の製品 (b) の場合)。 ):

(a)

<div id="productSearchResults">
<div class="productCard tracked">
<div>...</div>
<div class="stats">...</div>
<div class="desc collapsed descFull">...</div>
</div>

(ロ)

<div id="productSearchResults">
<div class="productCard featured tracked">
<div>...</div>
<div class="stats">...</div>
<div class="desc collapsed descFull">...</div>
</div>

(a) と (b) の両方で、方法 1 で呼び出した「desc」クラスを確認できます。これは正常に機能しているようです。このサイトで読んだことから、特定のクラスには複数の単語を含めることができないことを学んだと思います。タイトルに 3 語、2 語、3 語を含むクラスを表しますが、代わりに複数のクラスが割り当てられている場合は?

とにかく、'desc' の呼び出し (方法 1) は正常に機能し、すべての説明を取得しているようです。したがって、メソッド 2 では、「productCard」を呼び出すと、注目の製品と通常の製品の両方のすべての製品の情報が取得されると考えられます。すべての「productCard」を呼び出した場合、通常の機能と注目の機能が返されるべきではありませんか? 現在、これは当てはまりません。クラスとして「追跡」と「特集」だけを呼び出してみましたが、どちらも何も返さないため、「productCard」と同等の独自のクラスであるという私の論理には欠陥がある可能性があります。

要約すると、方法 1 の「desc」呼び出しは正常に機能し、「注目の」製品の説明も取得できます。ただし、連絡先情報が説明に含まれていて [obscured] と表示されている場合、データがスプレッドシートの次のセル (単語の直後) に表示されます。これはすべての組織を台無しにし、台無しにします。

方法 2 では、注目の製品をまったく入手できず、これにより、私がやろうとしていることが大幅に弱体化します。これらの問題のいずれか (または両方!) を修正できますか??

あなたが私に与えることができるどんな助けにもとても感謝しています.

***更新: 以下のコメントに見られるように、提案されているように「含む」を使用すると、通常の製品と注目の製品の両方を取得することにより、方法 2 が改善されました。ただし、注目の製品カードには余分なテキスト要素があり、この方法ではカード全体がスクレイピングされるため、注目の製品は通常の製品のセルの配置と一致しません。したがって、方法 1 を修正する方法があれば、これははるかに優れたものになります。以下のコメントで概説されているように、[隠蔽された] テキストは、下に続く/からインデントされた「スパン」に表示されます

<div class="desc descFull collapsed"

なので

<span class="obscureText">[obscured]</span>

私が行ってきたように「desc」をインポートする方法はありますが、XPathに[隠蔽された]スパンを本質的に「無視」するように指示するか、少なくとも[の直後に説明テキストを作成しない方法で処理します隠されている] 1 つのセル上に表示されますか?

どうもありがとうございました!

4

1 に答える 1

6

concatenate()関数を-functionでラップして、すべてが 1 つのセルに表示されるようにすることができます。

=concatenate(ImportXML(A1,"//div[@class='productCard']"))
于 2015-12-01T18:57:31.537 に答える