0

我正在与 ma project 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

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

4

1 回答 1

1

根据Selector'sextract()的文档:

提炼()

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

因此,extract()返回一个列表,您需要其中的第一项。使用item['link'][0].

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

  • for titles in titles循环没有意义,你需要一个单独的循环变量
  • HtmlXPathSelector已弃用,使用Selector
  • 用于urljoin()连接 url 的各个部分

这是带有修复和其他改进的完整代码:

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
于 2014-09-10T12:27:20.290 回答