Python 在刮痧I';我试图检索一个链接列表,然后将这些链接中的数据刮到一个刮片文件中。我的csv文件返回XPath列表。
我试着在这一页上使用igaggini的例子,但是可以;我的代码似乎无法使用它 我很确定我有正确的XPath,输出应该是从国家页面中删除的链接第一部分的第二段 这是我的主文件recursive.pyPython 在刮痧I';我试图检索一个链接列表,然后将这些链接中的数据刮到一个刮片文件中。我的csv文件返回XPath列表。,python,html,csv,xpath,scrapy,Python,Html,Csv,Xpath,Scrapy,我试着在这一页上使用igaggini的例子,但是可以;我的代码似乎无法使用它 我很确定我有正确的XPath,输出应该是从国家页面中删除的链接第一部分的第二段 这是我的主文件recursive.py from scrapy.spider import BaseSpider from bathUni.items import BathuniItem from scrapy.selector import HtmlXPathSelector from scrapy.http.request impor
from scrapy.spider import BaseSpider
from bathUni.items import BathuniItem
from scrapy.selector import HtmlXPathSelector
from scrapy.http.request import Request
from urlparse import urljoin
class recursiveSpider(BaseSpider):
name = 'recursive'
allowed_domains = ['http://www.bristol.ac.uk/']
start_urls = ['http://www.bristol.ac.uk/international/countries/']
def parse(self, response):
hxs = HtmlXPathSelector(response)
links = []
#scrap main page to get row links
for i in range(1, 154):
xpath = ('//*[@id="all-countries"]/li[*]/ul/li[*]/a' .format (i+1))
link = hxs.select(xpath).extract()
links.append(link)
#parse links to get content of the linked pages
for link in links:
item = BathuniItem()
item ['Qualification'] = hxs.select('//*[@id="uobcms-content"]/div/div/div[1]/p[2]')
yield item
这是我的项目档案
from scrapy.item import Item, Field
class BathuniItem(Item):
Country = Field()
Qualification = Field()
我收到的输出不是我想要的,我的csv文件中充满了这些-
<HtmlXPathSelector xpath='//*[@id="all-countries"]/li[*]/ul/li[*]/a' data=u'<a href="/international/countries/albani'>
您应该在选择器上调用
.extract()
,以获取有用的值,而不是选择器列表
item ['Qualification'] = hxs.select('//*[@id="uobcms-content"]/div/div/div[1]/p[2]').extract()
另一件事,我知道你想要获取与链接对应的页面
#parse links to get content of the linked pages
for link in links:
item = BathuniItem()
item ['Qualification'] = hxs.select('//*[@id="uobcms-content"]/div/div/div[1]/p[2]').extract()
yield item
该代码不会获取这些链接页面,您需要生成额外的请求
,以通知Scrapy下载它们
你应该这样做:
start_urls = ['http://www.bristol.ac.uk/international/countries/']
def parse(self, response):
hxs = HtmlXPathSelector(response)
links = []
#scrap main page to get row links
for i in range(1, 154):
xpath = ('//*[@id="all-countries"]/li[*]/ul/li[*]/a/@href' .format (i+1))
links.extend(hxs.select(xpath).extract())
#parse links to get content of the linked pages
for link in links:
yield Request(link, callback=self.parse_linkpage)
def parse_linkpage(self, response):
hxs = HtmlXPathSelector(response)
item = BathuniItem()
item ['Qualification'] = hxs.select('//*[@id="uobcms-content"]/div/div/div[1]/p[2]').extract()
return item
提示:所有的
[*]
谓词都是不必要的,例如,您匹配所有具有任何子元素的列表项,然后选择那些未排序的列表(仅当存在子元素时才返回结果)。尝试使用此代码后,我得到一个TypeError请求url必须是str或unicode,获取列表:我通过使用links.extend(hxs.select(xpath.extract())
,.extract())
返回列表修复了这个问题。