需要帮助理解程序的输出

时间:2014-09-10 09:16:31

标签: python-2.7 web-scraping scrapy scrapy-spider

我正在使用ma项目XYZ

我被困在从源中提取文本

<a href="/gifts" class="title" data-tracking-id="mdd-heading">gifts</a>

我想把href视为内容

我试过这个

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from XYZ.items import XYZ
class MySpider(BaseSpider):
    name = "main"
    allowed_domains = ["XYZ"]
    start_urls = ["XYZ"]
    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        titles = hxs.select("//a[@data-tracking-id='mdd-heading']")
        items = []
        for titles in titles:
            item = XYZ()
            item ["title"] = titles.select("text()").extract()
            item ["link"] = titles.select("@href").extract()
            items.append(item)
            print "www.xyz.com"+str(item["link"])
        return items

output

www.xyz.com[u'/gifts']

我期待输出为

www.xyz.com/gifts

我做错了什么......?

1 个答案:

答案 0 :(得分:1)

根据Selector's extract()的文档:

  

提取物()

     

序列化并返回匹配的节点作为unicode列表   字符串。编码内容百分比不加引号。

所以,extract()返回一个列表,你需要它的第一个项目。使用item['link'][0]

此外,代码中还有其他问题:

  • for titles in titles循环没有意义,你需要一个单独的循环变量
  • HtmlXPathSelector已弃用,请使用Selector
  • 使用urljoin()加入网址的部分

以下是包含修复和其他改进的完整代码:

from urlparse import urljoin

from scrapy.spider import BaseSpider
from scrapy.selector import Selector

from XYZ.items import XYZ


class MySpider(BaseSpider):
    name = "main"
    allowed_domains = ["XYZ"]
    start_urls = ["XYZ"]

    def parse(self, response):
        titles = response.xpath("//a[@data-tracking-id='mdd-heading']")
        for title in titles:
            item = XYZ()
            item ["title"] = title.xpath("text()").extract()[0]
            item ["link"] = title.xpath("@href").extract()[0]
            print urljoin("www.xyz.com", item["link"])

            yield item