Scrapy教程xpath代码多次擦除表

时间:2016-05-04 14:22:09

标签: python xpath web-scraping scrapy

我正在关注scrapy文档教程,我希望从以下站点获取示例数据: http://www.docteur.ch/generalistes/generalistes_k_ag.html

在scrapy中运行view命令后,我得到了以下我试图抓取的表的html代码。该页面包含每个条目的表格:

  <table class="novip">
    <tr class="novip">
      <td class="novip-portrait-picture"
        rowspan="5">
        <a class="novip-portrait-picture"
          href="/medecin/baumberger-hans-rudolf-aarau-5000-medecin.html">
          <img class="novip-portrait-picture"
            src="/customer_controlled/pictures/65903/portrait/65903.png"
            alt="Pas d'image encore"
            onError="portrait_m_image_failover(this)" />
        </a>
      </td>
      <td class="novip-left">
        <a class="novip-firmen-name"
          href="/medecin/baumberger-hans-rudolf-aarau-5000-medecin.html"
          target="_top">
          Baumberger&nbsp;Hans Rudolf
        </a>
      </td>
      <td class="novip-right"
        width="25%">
        <a class="novip"
          href="/medecin/baumberger-hans-rudolf-aarau-5000-medecin.html"
          target="_top">
          rating info:&nbsp;              <img class="novip-inforating"
            src="/img/general/stars/stars3 "
            alt="rating info"
            width="70" height="14" align="bottom" border="0" />
        </a>
      </td>
    </tr>
    <tr class="novip">
      <td class="novip-left">
        Dr. med. Facharzt FMH f&uuml;r Allgemeine Innere Medizin
      </td>
    </tr>
    <tr class="novip">
      <td class="novip-left">
        Bahnhofstrasse&nbsp;92, 5000&nbsp;Aarau
      </td>
      <td class="novip-right-telefon">
        t&eacute;l:&nbsp;062 822 46 28
      </td>
    </tr>
    <tr class="novip">
      <td class="novip-left-email">
        e-mail:&nbsp;
        <a class="novip-left-send-message-button-inactive"
          href="/eintrag/fr_keine_mitteilung_moeglich.html">
          Envoyer un message
        </a>
          &nbsp;
        <a class="novip-left-make_appointment-button-inactive"
          href="/eintrag/fr_kein_termin_moeglich.html">
          prendre un rendez-vous
        </a>
      </td>
      <td class="novip-right-fax">
        fax:&nbsp;062 822 35 20
      </td>
    </tr>
  </table>

对于我的蜘蛛,我使用教程中的基础知识和自定义xpath:

def parse(self, response):
        for sel in response.xpath('//tr[@class="novip"]'):
            item = DocteurItem()
            item['name'] = sel.xpath('//a[@class="novip-firmen-name"]/text()[normalize-space()]').extract()
            yield item

我在json中获得的输出为表中的每个名称生成一个名称Field,但用所有表中的所有名称填充它,如下所示:

[{"name": ["Name1, Name2, ..... NameN"] 
[{"name": ["Name1, Name2, ..... NameN"]

等等。我如何更改代码/ xpath,以便只用一个名称填充名称字段,然后移动到下一个表?

1 个答案:

答案 0 :(得分:2)

通过在开头添加一个点来为name 特定于上下文的创建表达式:

for sel in response.xpath('//tr[@class="novip"]'):
    item = DocteurItem()
    item['name'] = sel.xpath('.//a[@class="novip-firmen-name"]/text()[normalize-space()]').extract_first()
    yield item

请注意,我使用extract_first()代替extract()