2

特定のリンク構造を持つサイト (例: web.com) からコンテンツを抽出するために再帰スパイダーを実行しようとしています。例えば:

http://web.com/location/profile/12345678?qid=1403226397.5971&source=location&rank=21

http://web.com/location/profile/98765432?qid=1403366850.3991&source=場所&ランク=1

ご覧のとおり、URL の数値部分のみが変更されているため、この URL 構造に続くすべてのリンクをクロールして、itemX、itemY、itemZ を抽出する必要があります。

リンク構造を次のように正規表現に変換しました: '\d+?qid=\d+.\d+&source=location&rank=\d+'. Python-Scrapy コードは次のとおりですが、スパイダーを実行した後、スパイダーによって何も抽出されません。

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from web.items import webItem
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.http import Request
from scrapy import log
import re
import urllib

class web_RecursiveSpider(CrawlSpider):
    name = "web_RecursiveSpider"
    allowed_domains = ["web.com"]
    start_urls = ["http://web.com/location/profile",]

    rules = (Rule (SgmlLinkExtractor(allow=('\d+?qid=\d+.\d+&source=location&rank=\d+', ),) 
    , callback="parse_item", follow= True),
    )

    def parse_item(self, response):
        hxs = HtmlXPathSelector(response)
        sites = hxs.select('//*')
        items = []

        for site in sites:
            item = webItem()
            item["itemX"] = site.select("//span[@itemprop='X']/text()").extract()
            item["itemY"] = site.select("//span[@itemprop='Y']/text()").extract()
            item["itemZ"] = site.select("//span[@itemprop='Z']/text()").extract()
            items.append(item)
        return items
4

1 に答える 1

1

?正規表現でマークをエスケープする必要があります。

'\d+\?qid=\d+.\d+&source=location&rank=\d+'
    ^

デモ:

>>> import re
>>> url = "http://web.com/location/profile/12345678?qid=1403226397.5971&source=location&rank=21"
>>> print re.search('\d+?qid=\d+.\d+&source=location&rank=\d+', url)
None
>>> print re.search('\d+\?qid=\d+.\d+&source=location&rank=\d+', url)
<_sre.SRE_Match object at 0x10be538b8>

ドットもエスケープする必要があることに注意してください。ただし、提供した例には影響しません。

'\d+\?qid=\d+\.\d+&source=location&rank=\d+'
             ^
于 2014-06-21T16:40:29.990 に答える