Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.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
关于Java、Python、Scrapy和Xpath_Python_Sqlite_Xpath_Scrapy - Fatal编程技术网

关于Java、Python、Scrapy和Xpath

关于Java、Python、Scrapy和Xpath,python,sqlite,xpath,scrapy,Python,Sqlite,Xpath,Scrapy,我正在使用Scrapy和XPath从一个网站上获取一堆已售出的房产数据。共有9个不同的“项目”(销售价格、销售日期、代理商、代理商、地址、物业类型、卧室、浴室和完整URL)和每页20条记录。然后,我将结果存入SQLite3数据库 在我找到一个数据有点不完整的页面之前,一切都很顺利。如果一条记录中缺少一个变量,那么它会把所有事情都搞糟,页面中的任何内容都不会写入数据库 我很确定这是因为我以一种“非Python”的方式编写了代码,但无法找到解决这个问题的方法(Python或其他) 这是my pipe

我正在使用Scrapy和XPath从一个网站上获取一堆已售出的房产数据。共有9个不同的“项目”(销售价格、销售日期、代理商、代理商、地址、物业类型、卧室、浴室和完整URL)和每页20条记录。然后,我将结果存入SQLite3数据库

在我找到一个数据有点不完整的页面之前,一切都很顺利。如果一条记录中缺少一个变量,那么它会把所有事情都搞糟,页面中的任何内容都不会写入数据库

我很确定这是因为我以一种“非Python”的方式编写了代码,但无法找到解决这个问题的方法(Python或其他)

这是my pipelines.py文件中出现问题的部分:

def process_item(self, item, spider):

    self.cur.execute("CREATE TABLE IF NOT EXISTS Diditwork(Id INTEGER PRIMARY KEY, SalePrice TEXT, Address TEXT, Agent TEXT, Agency TEXT, DateSold TEXT, TypeOfProperty TEXT, Bedrooms TEXT, Bathrooms TEXT, FullURL TEXT)")
    n=int(0)
    for data in item['address']:

        self.cur.execute("INSERT INTO Diditwork (Saleprice, Agent, Agency, Address, DateSold, TypeOfProperty, Bedrooms, Bathrooms, FullURL) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", ((item['saleprice'][n]), (item['agent'][n]), (item['agency'][n]), (item['address'][n]), (item['datesold'][n]), (item['typeofproperty'][n]), (item['bedrooms'][n]), (item['bathrooms'][n]), (item['fullurl'][n])))

        self.conn.commit()
        n +=1

    return item
当记录中缺少变量时,我得到的错误是“exceptions.Indexer错误:列表索引超出范围”

我想这是因为我循环的编写方式。它将查找包含20个变量的列表,但在某些页面上,如果一个或多个记录不完整或丢失,它将尝试调用不存在的列表索引

例如,在一个页面上可能有20个地址记录,但只有15个代理记录。它尝试调用item['agent'][16],然后抛出一个错误,因为列表没有那么长

无论如何,我为我的问题解释得不好而道歉。我不确定我是否应该尝试实现某种错误处理,比如

if len(item['address']) != len(item['agent']): 
            #item['agent'] = ["not available"] * 20 
或者我的整个方法是否都错了

任何帮助都将不胜感激——我在这里有点不知所措,在一天半的时间里,我一直在努力自己解决这个问题

编辑:谢谢你们。我还有更多的测试要做,但我想我最终还是解决了这个问题。这是我正在使用的代码。我会让这个问题在24小时内无人回答,以防有人提出更优雅的解决方案

if len(item['address']) != len(item['agent']): #error checking
            difference = len(item['address']) - len(item['agent']) #find the disparity
            item['agent'].extend(["not available"] * difference) #append/extend the list by an appropriate number 

您的方法很紧凑,需要更少的代码和更少的处理,因此很好。你所缺少的只是适当的验证。输入数据库的任何数据都必须经过验证,在解析和存储之前,不仅要验证长度,还要验证和修复字段类型。

谢谢您的回复。你能详细说明一下吗?你有什么可以推荐的阅读材料吗;SQLite不强制执行类型或长度验证(除了
整型主键
列)。不过,这仍然是一个很好的验证方法。关于什么可能是最好的验证方法,有什么线索吗?我是否有办法检查len()中的项['address']和项['agent']之间的差异,然后在必要的次数内向项['agent']添加类似“数据不可用”的内容?我走对了吗?感谢Donal的回复。虽然wikipedia文章总结了数据验证()中可以涵盖的所有内容,但您应该根据应用程序选择需要验证的每个输入的属性。因为您正在放弃html,所以应该主要关注与数据库的兼容性。检查方法可以像函数中包含的if-else嵌套语句一样简单。此外,如果您担心在将来的任何应用程序中出于安全目的进行数据验证,下面是一篇有趣的文章: