私はスクレイプシェルの陶器の納屋で価格のテキストを取得しようとしています。scrapy shell "https://www.potterybarnkids.com/shop/easter/easter-shop-all-baskets/"
スパン内の価格を取得しようとして使用しましたが、class="price-state price-sale"
スパン内の各スパンに移動して、スパン内のテキスト全体を抽出する方法はありますか?
私は試した
response.xpath('//span[@class="price-state price-sale"]/text()').extract()
また response.xpath('//span[@class="price-state price-sale"]//text()')[0].extract()
内部スパン、div、...があるセレクター天気内のすべてのテキストを抽出する方法が必要です。
私がチェックし、私はpythonでscrapyセレクタにテキストのみを抽出することができますどのようにも、ScrapyはDIVからテキストを抽出する答えは、それがその一例であり、このいずれかで動作する唯一のスパン子供が含まれていることを前提とし、この1に。しかし、//text()
が機能していないため、子内のすべてのテキストを正しく抽出するためのより一般的な方法はありますか。
もっと効率的な方法があると思いますが、次の方法でxpath
うまくいきます。string()
XPathの上には、すべての子ノードからテキストを収集します。
この投稿の違いについての詳細はstring()
、text()
この投稿を参照してください。text()とstring()の違い
prices = [
r.xpath('string(.)').extract_first()
for r in response.xpath('//span[@class="price-state price-sale"]')
]
結果からわかるように、行ごとに1つの製品。replace
たとえば、でクリーニングしたり、を使用して価格を抽出したりできます。regex
>>> prices
['\n\nSale\n\n\n$5.99\n–\n\n$18.99\n', '\n\nSale\n\n\n$6...
他のオプションは、操作の前にデータをtext()
代わりに使用してstring()
データをクリーニングするという2つのステップでそれを行うことですjoin
。
>>> prices = []
>>> for r in response.xpath('//span[@class="price-state price-sale"]'):
>>> price = [p.strip() for p in r.xpath('.//text()').extract() if p.strip()]
>>> prices.append(' '.join(price))
この場合の結果はすでにクリーンアップされています
>>> prices
['Sale $ 5.99 – $ 18.99', 'Sale $ 6.99 – $ 18.99', 'Sale $ 6.99...
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加