Как создать правила в Scrapy Python? - PullRequest
0 голосов
/ 21 ноября 2011

У меня проблемы при создании правила.Предположим, что мой начальный URL-адрес http://www.example.com/search?q=news
, когда я открываю этот URL-адрес в веб-браузере, я получаю следующий исходный код:

<html><head>...</head><body>
<ul id="results-list">
<li class="result clearfix news">
<div class="summary">
<h3><a href="/sports/hockey/struggling-canucks-rely-on-schneider-to-snag-win-against-sens/article2243069/">Struggling Canucks rely on Schneider to snag win against Sens</a></h3>
<p class="summary">Nov 21, 2011&ndash; Eleventh place Canucks rely on goalie Cory Schneider to improve record to 10-9-1
</p>
<p class="meta"><a href="/sports/hockey/struggling-canucks-rely-on-schneider-to-snag-win-against-sens/article2243069/">http://www.example.com/sports/hockey/struggling-canucks-rely-on-schneider-to-snag-win-against-sens/article2243069/</a>
</p>
</div>
</li>
<li class="result clearfix news">
<div class="summary">
<h3><a href="/news/world/celebrities-set-to-testify-at-uk-media-ethics-inquiry/article2242840/">Celebrities set to testify at U.K. media ethics inquiry</a></h3>
<p class="summary">Nov 20, 2011&ndash; Hugh Grant and J.K. Rowling given opportunity to strike back against tabloids’ invasion of privacy
</p>
<p class="meta"><a href="/news/world/celebrities-set-to-testify-at-uk-media-ethics-inquiry/article2242840/">http://www.example.com/news/world/celebrities-set-to-testify-at-uk-media-ethics-inquiry/article2242840/</a>
</p>
</div>
</li>
...
</ul><!-- end of ul#results-list -->

<ul class="paginator">
<li class="selected"><a href="http://www.example.com/search/?q=news&start=0">1</a></li>
<li ><a href="http://www.example.com/search/?q=news&start=10">2</a></li>
<li ><a href="http://www.example.com/search/?q=news&start=20">3</a></li>
...
<li class="jump last"><a href="http://www.example.com/search/?q=news&start=90">Last</a></li>
</ul><!-- end of ul.paginator -->
</body></html>

Теперь я хочу извлечь данные из ссылок (эта ссылкаприсутствует в ul # result-list) http://www.example.com/sports/hockey/struggling-canucks-rely-on-schneider-to-snag-win-against-sens/article2243069/ и так далее ...

Я создал паука для этого следующим образом:

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from thirdapp.items import ThirdappItem

class MySpider(CrawlSpider):
    name = 'example.com'
    allowed_domains = ['example.com']
    start_urls = [
        'http://www.example.com/search?q=news',
        'http://www.example.com/search?q=movies',
        ]
    rules = (
        Rule(SgmlLinkExtractor(allow('?q=news',), restrict_xpaths('ul[@class="paginator"]',)), callback='parse_item', allow=True),
        )

    def parse_item(self, response):
        self.log('Hi, this is an item page! %s', response.url)

        hxs = HtmlXPathSelector(response)
        #item = ThirdappItem()
        items = hxs.select('//h3')
        scraped_items = []
        for item in items:
            scraped_item = ThirdappItem()
            scraped_item["title"] = item.select('a/text()').extract()
            scraped_items.append(scraped_item)
        return items

spider = MySpider()

Так что быбудут ли правила, чтобы я достиг ожидаемых результатов?

Ответы [ 2 ]

1 голос
/ 21 ноября 2011

во-первых, каких результатов вы ожидаете именно?во-вторых, может быть, вам следует обратиться к ссылкам в ваших правилах, а не только к ul-контейнеру, который содержит узлы элементов списка, которые имеют необходимые узлы ссылок!?

0 голосов
/ 22 ноября 2011

Согласно документации, параметр SgmlLinkExtractor allow - одно регулярное выражение (или список регулярных выражений), которому должны соответствовать URL-адреса ( absolute ) для извлечения. Поэтому параметр allow будет выглядеть так:

allow=('.*\?q=news.*',)

И, скорее всего, последний параметр правила не allow, а follow=True.

Окончательное правило (обратите внимание на escape-знак для знака вопроса):

Rule(SgmlLinkExtractor(allow=('.*\?q=news.*',), restrict_xpaths=('ul[@class="paginator"]',)), callback='parse_item', follow=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...