Scrapy 无法通过页面上的两个表格获取正确的数据
Scrapy not getting correct data with two tables on the page
我一直在使用 scrapy 来抓取一些数据,我最近开始抓取的其中一个页面与正常页面相比有两个 table。我想分别抓取 tables 并且确实有 ID。我已经尝试使用各种路径(如下所示),但我最终要么将两个 table 拼凑在一起,要么是一个空白的项目字典,要么是 scrapy 找不到路径。网站在这里:
http://www.faa.gov/data_research/commercial_space_data/licenses/
我试过没有 return 的爬虫 response.xpath()
值是:
//*[@id="DataTables_Table_0"]
//*[@id="DataTables_Table_1"]
/html/body/div[2]/div/div[2]/div[1]/table
/html/body/div[2]/div/div[2]/div[2]/table
Xpath return 是一个空的 Scrapy 项目:
(//table)[1]/tbody
如果我按预期使用 //tbody
和 //tr
,我最终会得到一个包含两个 table 的列表。
我的蜘蛛代码:
from scrapy.spiders import Spider
import items as spi
class ActiveLaunchLicenseSpider(Spider):
name = "faa_actlnchlic"
allowed_domains = ['faa.gov']
start_urls = ['http://www.faa.gov/data_research/commercial_space_data/licenses/']
def parse(self, response):
licenses = response.xpath('//tbody')
for license in licenses:
license_item = spi.ActiveLaunchLicenseScraperItem()
license_item['license'] = license.xpath('//tr/td[1]/a').extract()
license_item['company'] = license.xpath('//tr/td[2]').extract()
license_item['vehicle'] = license.xpath('//tr/td[3]').extract()
license_item['location'] = license.xpath('//tr/td[4]').extract()
license_item['expiration'] = license.xpath('//tr/td[5]/span').extract()
yield license_item
有人可以帮助我了解我的基于 ID 的路径是如何错误的(使用 Firebug 来识别它们)以及一次 select 一个 table 的好方法吗?
以下代码可能有助于废料数据
import scrapy
from faa_gov.items import FaaGovItem
class faa_gov(scrapy.Spider):
name = "faa_actlnchlic"
allowed_domains = ['faa.gov']
start_urls = ['http://www.faa.gov/data_research/commercial_space_data/licenses/']
def parse(self, response):
licenses = response.xpath("//caption[text()='Active Launch Licenses']/following-sibling::tbody[1]/tr")
for license in licenses:
license_item = FaaGovItem()
license_item['license'] = license.xpath('.//td[1]/a').extract()
license_item['company'] = license.xpath('.//td[2]').extract()
license_item['vehicle'] = license.xpath('.//td[3]').extract()
license_item['location'] = license.xpath('.//td[4]').extract()
license_item['expiration'] = license.xpath('.//td[5]/span').extract()
yield license_item
我一直在使用 scrapy 来抓取一些数据,我最近开始抓取的其中一个页面与正常页面相比有两个 table。我想分别抓取 tables 并且确实有 ID。我已经尝试使用各种路径(如下所示),但我最终要么将两个 table 拼凑在一起,要么是一个空白的项目字典,要么是 scrapy 找不到路径。网站在这里:
http://www.faa.gov/data_research/commercial_space_data/licenses/
我试过没有 return 的爬虫 response.xpath()
值是:
//*[@id="DataTables_Table_0"]
//*[@id="DataTables_Table_1"]
/html/body/div[2]/div/div[2]/div[1]/table
/html/body/div[2]/div/div[2]/div[2]/table
Xpath return 是一个空的 Scrapy 项目:
(//table)[1]/tbody
如果我按预期使用 //tbody
和 //tr
,我最终会得到一个包含两个 table 的列表。
我的蜘蛛代码:
from scrapy.spiders import Spider
import items as spi
class ActiveLaunchLicenseSpider(Spider):
name = "faa_actlnchlic"
allowed_domains = ['faa.gov']
start_urls = ['http://www.faa.gov/data_research/commercial_space_data/licenses/']
def parse(self, response):
licenses = response.xpath('//tbody')
for license in licenses:
license_item = spi.ActiveLaunchLicenseScraperItem()
license_item['license'] = license.xpath('//tr/td[1]/a').extract()
license_item['company'] = license.xpath('//tr/td[2]').extract()
license_item['vehicle'] = license.xpath('//tr/td[3]').extract()
license_item['location'] = license.xpath('//tr/td[4]').extract()
license_item['expiration'] = license.xpath('//tr/td[5]/span').extract()
yield license_item
有人可以帮助我了解我的基于 ID 的路径是如何错误的(使用 Firebug 来识别它们)以及一次 select 一个 table 的好方法吗?
以下代码可能有助于废料数据
import scrapy
from faa_gov.items import FaaGovItem
class faa_gov(scrapy.Spider):
name = "faa_actlnchlic"
allowed_domains = ['faa.gov']
start_urls = ['http://www.faa.gov/data_research/commercial_space_data/licenses/']
def parse(self, response):
licenses = response.xpath("//caption[text()='Active Launch Licenses']/following-sibling::tbody[1]/tr")
for license in licenses:
license_item = FaaGovItem()
license_item['license'] = license.xpath('.//td[1]/a').extract()
license_item['company'] = license.xpath('.//td[2]').extract()
license_item['vehicle'] = license.xpath('.//td[3]').extract()
license_item['location'] = license.xpath('.//td[4]').extract()
license_item['expiration'] = license.xpath('.//td[5]/span').extract()
yield license_item