AttributeError:' list'对象没有属性'提取'?

时间:2015-11-12 09:46:47

标签: python python-2.7 web-crawler

我只想通过xpath从这个网址(http://www.tuniu.com/g3300/whole-nj-0/list-l1602-h0-i-j0_0/)中提取信息。 当我运行以下代码时,会出现AttributeError:' list'对象没有属性'提取'? 我的模块导入错误或不匹配?

# -*- coding: utf-8 -*-

import urllib2
import sys
import lxml.html as HTML
reload(sys)
sys.setdefaultencoding("utf-8")


class spider(object):
    def __init__(self):
        print u'开始爬取内容'

def getSource(self, url):
    html = urllib2.Request(url)
    pageContent = urllib2.urlopen(html,timeout=60).read()
    return pageContent

def getUrl(self, pageContent):
    htmlSource = HTML.fromstring(pageContent)
    urlInfo = htmlSource.xpath('//dd[@class="tqs"]/span/a/@href').extract()[0]
    return urlInfo


if __name__ == "__main__":
    url = "http://www.tuniu.com/g3300/whole-nj-0/list-l1602-h0-i-j0_0/"
    tuniu = spider()
    tuniu.getUrl(url)

以下是错误!

 Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "D:\anzhuang\Anaconda\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 682, in runfile
execfile(filename, namespace)
 File "D:\anzhuang\Anaconda\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 71, in execfile
exec(compile(scripttext, filename, 'exec'), glob, loc)
 File "D:/python/tuniu2/tuniu.py", line 34, in <module>
tuniu.getUrl(url)
 File "D:/python/tuniu2/tuniu.py", line 27, in getUrl
urlInfo = htmlSource.xpath('//dd[@class="tqs"]/span/a/@href').extract()[0]
 AttributeError: 'list' object has no attribute 'extract'

2 个答案:

答案 0 :(得分:1)

首先,使用网址调用getUrl。它不会获取网址的内容。修改它以获取页面内容。

不需要extract。要获取href,只需从返回的列表中获取一个项目。

def getUrl(self, url):
    pageContent = self.getSource(url)  # <---
    htmlSource = HTML.fromstring(pageContent)
    urlInfo = htmlSource.xpath('//dd[@class="tqs"]/span/a/@href')[0]
    return urlInfo

答案 1 :(得分:0)

xpath将返回URL中包含的标记列表,因此您尝试在列表中提取而不是包含在其中的任何标记。如果您只想提取第一个标记,那么您可能希望在提取调用之前放置[0],如下所示:

urlInfo = htmlSource.xpath('//dd[@class="tqs"]/span/a/@href')[0].extract()

目前还不清楚您想要哪些信息,但如果它未包含在第一个标记中,那么您可能希望使用urlInfo迭代for tag in urlInfo。然后是tag.extract()