使用XPATH刮取属性值?

时间:2017-06-25 18:57:47

标签: python xpath web-scraping scrapy

我刚开始使用XPath进行html抓取,所以我对语法有点困惑。我正在尝试从以下代码片段中提取网址:

  <a href="/realestateandhomes-detail/15645-SW-74th-Circle-Dr-Apt-5_Miami_FL_33193_M69309-37779">
      <img alt="15645 Sw 74th Circle Dr Apt 5, Miami, FL 33193" title="15645 Sw 74th Circle Dr Apt 5, Miami, FL 33193" class="js-srp-listing-photos" itemprop="image" data-src="https://ap.rdcpix.com/1980533383/49e7a93da461352c04b8e7146a8d2ceel-m0xd-w480_h480_q80.jpg" data-omtag="srp-listMap:result:photo" src="https://ap.rdcpix.com/1980533383/49e7a93da461352c04b8e7146a8d2ceel-m0xd-w480_h480_q80.jpg" />
  </a>

html路径如下:

<body> 
  <li>
    <div>
      <a></a>

我正在使用scrapy来解析html页面,到目前为止这是我的代码:

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from realtor.items import RealtorItem
class RealtorSpider(BaseSpider):
    name = "realtor"
    allowed_domains = ["realtor.com"]
    start_urls = [
        "http://www.realtor.com/realestateandhomes-search/Miami_FL"
        ]
    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        sites = hxs.select('//li/div/a/@href')
        items = []
        for site in sites:
            item = RealtorItem()
            item['link'] = site.select('div/a/@href').extract()
            items.append(item)
        return items

当我运行代码时,它在第16行返回错误,即item [] = site.select()。extract()。我不确定语法是否正确,或者我还缺少另一个潜在的问题。

错误是

KeyError: 'RealtorItem does not supprot field: link'

我的items.py代码如下:

from scrapy.item import Item, Field
class RealtorItem(Item):
    link = scrapy.Field()

1 个答案:

答案 0 :(得分:1)

您正尝试使用此选择器href提取//li/div/a/@href属性,然后遍历每个提取的元素,但是您在href中获取提取的文本时实际执行的操作再次使用//li/div/a/@href选择器时无法获取任何内容的属性。

这是针对您的Spider类的较新版本的scrapy实现的修复

import scrapy

class RealtorSpider(scrapy.Spider):
    name = "realtor"
    allowed_domains = ["realtor.com"]
    start_urls = [
        "http://www.realtor.com/realestateandhomes-search/Miami_FL"
        ]
    def parse(self, response):
        sites = response.xpath('//li/div/a') # <----- fetches all the <a> tags
        items = []
        for site in sites:
            print(site.extract())
            item = RealtorItem()
            item['link'] = site.xpath('@href').extract() # <--- extract value from a tag
            items.append(item)
        return items

这是items.py文件

from scrapy.item import Item, Field
class RealtorItem(Item):
    link = Field()

完全不相关的建议:这与您的代码无关,但您在scrapy中使用了一些不推荐使用的函数。您应该浏览scrapy tutorial以了解如何开始使用较新版本的scrapy。