0

このコードは機能していません:

name="souq_com"
allowed_domains=['uae.souq.com']
start_urls=["http://uae.souq.com/ae-en/shop-all-categories/c/"]

rules = (
    #categories
    Rule(SgmlLinkExtractor(restrict_xpaths=('//div[@id="body-column-main"]//div[contains(@class,"fl")]'),unique=True)),
    Rule(SgmlLinkExtractor(restrict_xpaths=('//div[@id="ItemResultList"]/div/div/div/a'),unique=True),callback='parse_item'),
    Rule(SgmlLinkExtractor(allow=(r'.*?page=\d+'),unique=True)),
)

最初のルールは応答を取得していますが、2 番目のルールは機能していません。2 番目のルール xpath は正しいと確信しています (scrapy shell を使用して試しました)。また、最初のルールにコールバックを追加して、2 番目のルールのパスを選択しようとしました ('//div[@id="ItemResultList "]/div/div/div/a') を呼び出してリクエストを発行すると、正しく機能しています。

Crawl Spider の代わりに Base Spider を使用しようとしましたが、最初のリクエストのみを発行し、コールバックは発行しませんでした。どうすれば修正できますか?

4

1 に答える 1

2

ルールの順序は重要です。CrawlSpider のスクラップドキュメントによるとrules

複数のルールが同じリンクに一致する場合、この属性で定義されている順序に従って、最初のルールが使用されます。

http://uae.souq.com/ae-en/shop-all-categories/c/の最初のリンク、つまりhttp://uae.souq.com/ae-en/antique/l/をたどると、フォローしたいアイテムはこの構造の中にあります

<div id="body-column-main">
    <div id="box-ads-souq-1340" class="box-container ">...
    <div id="box-results" class="box-container box-container-none ">
        <div class="box box-style-none box-padding-none">
            <div class="bord_b_dash overhidden hidden-phone">
            <div class="item-all-controls-wrapper">
            <div id="ItemResultList">
                <div class="single-item-browse fl width-175 height-310 position-relative">
                <div class="single-item-browse fl width-175 height-310 position-relative">
                ...

したがって、2 番目のルールで対象とするリンクは<div>クラスに「fl」が含まれているため、これらは のすべてのリンクを検索する最初のルールにも一致するため、'//div[@id="body-column-main"]//div[contains(@class,"fl")]'で解析されませんparse_item

簡単な解決策:「カテゴリ」ルールの前に2番目のルールを配置してみてください(unique=TrueデフォルトではSgmlLinkExtractor

name="souq_com"
allowed_domains=['uae.souq.com']
start_urls=["http://uae.souq.com/ae-en/shop-all-categories/c/"]

rules = (
    Rule(SgmlLinkExtractor(restrict_xpaths=('//div[@id="ItemResultList"]/div/div/div')), callback='parse_item'),

    #categories
    Rule(SgmlLinkExtractor(restrict_xpaths=('//div[@id="body-column-main"]//div[contains(@class,"fl")]'))),

    Rule(SgmlLinkExtractor(allow=(r'.*?page=\d+'))),
)

もう 1 つのオプションは、カテゴリ ページの最初のルールを、個々のカテゴリ ページには存在しない、より制限的な XPath に変更することです。'//div[@id="body-column-main"]//div[contains(@class,"fl")]//ul[@class="refinementBrowser-mainList"]'

カテゴリ ページの正規表現を定義し、acceptルールでパラメーターを使用することもできます。

于 2013-08-25T11:02:18.053 に答える