首页 > 解决方案 > 如何使用 scrapy 获取 xlink:href/svg id 的名称?

问题描述

我对scrapy完全陌生,昨天才开始使用它。有一个页面包含我想要获得的产品的评级。不幸的是,收视率不是文字而是星星。假设一个产品获得了两颗星,它看起来像这样:

<div class="index-classRating">
  <div class="index-classIcon index-red">
    <svg viewBox="0 0 32 32">
      <use xlink:href="/static/media/icons.f88ec073.svg#wci-starrating-full">
        #shadow-root (closed)
          <svg id="wci-starrating-full" viewBox="0 0 512 512" width="100%" height="100%">
            <path d="1 2 3"></path>
          </svg>
      </use>
    </svg>
  </div>
  <div class="index-classIcon index-red">
    <svg viewBox="0 0 32 32">
      <use xlink:href="/static/media/icons.f88ec073.svg#wci-starrating-full">
        #shadow-root (closed)
          <svg id="wci-starrating-full" viewBox="0 0 512 512" width="100%" height="100%">
            <path d="1 2 3"></path>
          </svg>
      </use>
    </svg>
  </div>

所以我想计算有多少颗星,即“/static/media/icons.f88ec073.svg#wci-starrating-full”或“wci-starrating-full”。

所以我尝试了

stars = response.xpath('//div[@class="index-classIcon index_red"]/svg[@viewBox="0 0 32 32"]/use[@xlink:href="/static/media/icons.f88ec073.svg#wci-starrating-full"]/svg/@id').extract()

并得到一个空列表。但我想要类似的东西

stars = ["wci-starrating-full","wci-starrating-full"]

标签: python-3.xweb-scrapingscrapy

解决方案


视图框必须小写,“index_red”有破折号而不是连字符试试

stars=response.xpath('//div[@class="index-classIcon index-red"]/svg[@viewbox="0 0 32 32"]/use/svg/@id').extract()

全部示例:(请复制粘贴到python中)

import scrapy
response=scrapy.http.HtmlResponse(url='just_a_string',encoding='utf-8',body=u'''
<div class="index-classRating">
  <div class="index-classIcon index-red">
    <svg viewBox="0 0 32 32">
      <use xlink:href="/static/media/icons.f88ec073.svg#wci-starrating-full">
        #shadow-root (closed)
          <svg id="wci-starrating-full" viewBox="0 0 512 512" width="100%" height="100%">
            <path d="1 2 3"></path>
          </svg>
      </use>
    </svg>
  </div>
  <div class="index-classIcon index-red">
    <svg viewBox="0 0 32 32">
      <use xlink:href="/static/media/icons.f88ec073.svg#wci-starrating-full">
        #shadow-root (closed)
          <svg id="wci-starrating-full" viewBox="0 0 512 512" width="100%" height="100%">
            <path d="1 2 3"></path>
          </svg>
      </use>
    </svg>
  </div>
''')
stars=response.xpath('//div[@class="index-classIcon index-red"]/svg[@viewbox="0 0 32 32"]/use/svg/@id').extract()
print(repr(stars))

推荐阅读