【问题标题】:Scrape attribute value using XPATH?使用 XPATH 刮取属性值?
【发布时间】:2017-11-28 16:38:12
【问题描述】:

我刚开始使用 XPath 进行 html 抓取,所以我对语法有点困惑。我正在尝试从源代码的以下 sn-p 中提取 url:

  <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()

【问题讨论】:

  • 你用的是什么版本的scrapy?
  • 它是scrapy v 1.4.0

标签: python xpath web-scraping scrapy


【解决方案1】:

您正在尝试使用此选择器 //li/div/a/@href 提取 href 属性,然后遍历每个提取的元素,但是您在提取的 href 属性中的提取文本实际上是在做什么不提取再次使用 //li/div/a/@href 选择器时的任何事情。

这是在较新版本的 scrapy 中为您的 Spider 类实现的修复

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。

【讨论】:

  • 我尝试更改代码,但它仍然给我同样的错误:{KeyError: 'RealtorItem does not support field: link'} 是不是我的 item.py 文件有问题 它也已弃用功能?
  • 是的。我将使用我拥有的items.py 文件更新我的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 2023-03-07
  • 2017-10-13
  • 2011-05-30
相关资源
最近更新 更多