Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在刮痧I';我试图检索一个链接列表,然后将这些链接中的数据刮到一个刮片文件中。我的csv文件返回XPath列表。_Python_Html_Csv_Xpath_Scrapy - Fatal编程技术网

Python 在刮痧I';我试图检索一个链接列表,然后将这些链接中的数据刮到一个刮片文件中。我的csv文件返回XPath列表。

Python 在刮痧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

我试着在这一页上使用igaggini的例子,但是可以;我的代码似乎无法使用它

我很确定我有正确的XPath,输出应该是从国家页面中删除的链接第一部分的第二段

这是我的主文件recursive.py

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())
返回列表修复了这个问题。