因此,我试图从页面上获取更多数据,具体取决于我使用Scrapy在下拉列表上选择的内容。
访问:http://grace.itam.mx/EDSUP/BWZKSENP.P_Horarios1?s=1416
在下面的代码中,首先我获得了下拉列表的所有元素,并且工作正常。
但是我也想在选择一个Element然后单击submbit进入带有数据表的新页面后获得信息。反正有这样做吗?
# run this file as
# scrapy runspider scrappy-itam.py -t csv -o s4-out.csv
from scrapy.spiders import Spider
from collections import OrderedDict
class MySpider(Spider):
name = 's4'
allowed_domains = ['grace.itam.mx']
start_urls = [ "http://grace.itam.mx/EDSUP/BWZKSENP.P_Horarios1?s=1416"]
def parse(self, response):
items = []
for cour in response.xpath("//div[@class='pagebodydiv']/form/select/option/text()"):
item = OrderedDict()
info=cour.extract()
course=info.split('-')
item['Department']=course[0]
item['Course']=course[2]
items.append(item)
return items
编辑: 在这里,我使用了FormRequest来解析新页面。
lass MySpider(Spider):
name = 's4'
allowed_domains = ['grace.itam.mx']
start_urls = [ "http://grace.itam.mx/EDSUP/BWZKSENP.P_Horarios1?s=1416"]
def parse(self, response):
for c in response.xpath("//div[@class='pagebodydiv']/form/select/option/text()"):
item = OrderedDict()
info=c.extract()
yield scrapy.FormRequest.from_response(response,formdata={'TXT_MATERIA':info},callback=self.after_button)
def after_button(self,response):
yield response.xpath("//div[3]/table[1]/tbody/tr[1]/td[1]/b/text()").extract()
答案 0 :(得分:0)
使用Scrapy FormRequest.from_response,将要选择的Element中的值用作参数。这样,您就可以使用Spider中的另一种方法来解析另一页的内容。
编辑1:
您的FormRequest
中有一个错误。更改为:
scrapy.FormRequest.from_response(response,formdata={'txt_materia':info, 's' : '1416'})
我不认为需要添加s : 1416
参数,但是txt_materia
应该是小写字母。当我将其用作上面的代码时,响应是正确的。
在您的after_button
方法中,我发现了两个小错误:
tbody
上使用xpath。使用相对路径来避免它们!这是我为after_button
编写的代码:
def after_button(self,response):
yield { "text" : response.xpath("//div[3]/table[1]//tr[1]/td[1]/b/text()").extract_first() }