Html 列出网站同一页面中包含的所有链接和信息

Html 列出网站同一页面中包含的所有链接和信息,html,scrapy,scrape,Html,Scrapy,Scrape,我有下面的迷你基本蜘蛛,我用它来获取网站的所有链接 from scrapy.item import Field, Item from scrapy.contrib.spiders import CrawlSpider, Rule from scrapy.contrib.linkextractors import LinkExtractor class SampleItem(Item): link = Field() class SampleSpider(CrawlSpider):

我有下面的迷你基本蜘蛛,我用它来获取网站的所有链接

from scrapy.item import Field, Item
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor


class SampleItem(Item):
    link = Field()


class SampleSpider(CrawlSpider):
    name = "sample_spider"
    allowed_domains = ["example.com"]
    start_urls = ["http://www.example.com/"]

    rules = (
        Rule(LinkExtractor(), callback='parse_page', follow=True),
    )

    def parse_page(self, response):
        item = SampleItem()
        item['link'] = response.url
        return item
我想知道是否有可能添加相同的蜘蛛从这些相同的链接中抓取一些html(如下面的一个),并在两个单独的列中列出csv中的链接和信息

<span class="price">50,00&nbsp;€</span>
50,00€

马克:是的,当然有可能。首先,你需要使用一个。这可以通过以下选项在
设置.py
中设置:

FEED_FORMAT = 'csv'
FEED_URL = 'file:///absolute/path/to/the/output.csv'
然后,您必须调整您的项目,以允许更多的元素。目前,您仅使用该链接。您需要添加一个
price
字段

class SampleItem(Item):
    link = Field()
    price = Field()
一方面注意:通常我们在
items.py
文件中定义项目,因为通常多个爬行器应该从多个页面中刮取相同类型的项目。然后使用scrapername.items import SampleItem将它们导入到spider中。这方面的一个示例应用程序是一个价格刮刀,它可以刮掉亚马逊和一些较小的商店

最后,您必须调整spider的
parse_页面
方法。当前,您仅将URL保存到项目中。您希望找到价格并保存它。在页面上查找数字或文本是抓取的关键要素。为了这个目的,我们有。Scapy支持XPath、CSS和正则表达式选择器。前两个特别有用,因为它们可以嵌套。当您找到正确的HTML元素时,通常会使用正则表达式,但是一个元素中的信息太多

您可能会遇到的一个问题是,一个页面可能有多个
.price
元素。你确定只有一个吗?否则,选择器将为您提供所有这些标记,您可能需要使用更多其他标记来优化选择器

因此,让我们假设只有这个
.price
元素,并构造选择器。我们在这里使用CSS选择器,因为在这种情况下它更直观。您可以使用
css
xpath
方法直接在响应上调用选择器。它们总是返回可以再次使用
css()
xpath()
的元素。要获得文本表示,需要对它们调用
extract()
。这在开始时可能很烦人,但是嵌套选择器非常方便。请注意,选择器为您提供了完整的HTML元素,包括标记。要仅获取文本内容,需要将其显式化。对于CSS选择器,通过
::text
,对于XPath,通过
/text()

def parse_page(self, response):
    item = SampleItem()
    item['link'] = response.url
    try:
        item['price'] = response.css('.price::text')[0].extract()
    except IndexError:
        # do whatever is best if price cannot be found
        item['price'] = None
    return item