我刚开始使用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()
答案 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。