提取空的 td 值,尽管表格中没有空值。

2024-09-28 01:27:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我造了一个蜘蛛来爬行一个单独的网站: www.docteur.ch/generalistes/generalistes_k_ag.html在

它使用以下格式对表的td进行爬网:

<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>

我只想用以下代码提取医生的个人姓名:

^{pr2}$

我提取了名称,但是对于每个条目也有两个空字段,尽管页面的源代码中没有空td

    [{"name": "\n              Baumberger\u00a0Hans Rudolf\n            "},
{"name": "not-found"},
{"name": "not-found"},
{"name": "not-found"},
{"name": "\n              Bettschart\u00a0Robert\n            "},
{"name": "not-found"},
{"name": "not-found"},
{"name": "not-found"},
....]

我的代码有什么问题?如何仅提取具有值的单元格?在


Tags: namehtmlnotlefttrclasstdhref
2条回答

使用CSS选择器替代@Padraic的答案:

  1. 对于每个表,选择第一个子行,类为“novip”
  2. 在每一行中,用“novip firmen name”类选择锚定

在破壳里:

>>> for row in response.css('table.novip > tr.novip:first-child'):
...     print("     ")
...     s = row.css('a.novip-firmen-name').xpath('normalize-space()').extract_first()
...     pprint(s)
... 
     
u'Baumberger\xa0Hans Rudolf'
     
u'Bettschart\xa0Robert'
     
u'Bock\xa0Andreas'
     
u'Br\xe4ndli\xa0Heinrich'
     
u'Buchser\xa0Marcel'
     
u'B\xfchlmann\xa0Severin'
     
u'Dang\xa0Linh'
(...)
     
u'Vonesch\xa0Hans-J\xfcrg'
     
u'Koppe\xa0Dagmar'
>>> 

这将得到所有名称:

 names = response.xpath('//table/tr[@class="novip"]//a[@class="novip-firmen-name"]//text()').extract()

它只返回467个名称:

^{pr2}$

当您检查所有tr时会得到空结果,因此当您没有找到一个带有class="novip-firmen-name"的tr时,您将输出默认值。在

如果我们拿前几张,你就能看到我们发生了什么:

In [23]: for sel in response.xpath('//table/tr[@class="novip"]')[:5]:
             print(sel.xpath('.//td[2]/a[@class="novip-firmen-name"]'))
   ....:     
[<Selector xpath='.//td[2]/a[@class="novip-firmen-name"]' data=u'<a class="novip-firmen-name" href="/mede'>]
[]
[]
[]
[<Selector xpath='.//td[2]/a[@class="novip-firmen-name"]' data=u'<a class="novip-firmen-name" href="/mede'>]

如果只搜索具有class="novip-firmen-name"的锚定标记,则会得到您想要的结果:

 In [38]: for sel in response.xpath('//table/tr[@class="novip"]//a[@class="novip-firmen-name"]')[:5]:
         print(sel.xpath('.//text()').extract_first().strip())
....:     
Baumberger Hans Rudolf
Bettschart Robert
Bock Andreas
Brändli Heinrich
Buchser Marcel

或者,您可以搜索具有锚定标记的tds,这些tds与您想要获得这些tds的类一起:

In [39]: for sel in response.xpath('//table/tr[@class="novip"]/td[a[@class="novip-firmen-name"]]')[:5]:
             print(sel.xpath('./a/text()').extract_first()).strip()
   ....:     
Baumberger Hans Rudolf
Bettschart Robert
Bock Andreas
Brändli Heinrich
Buchser Marcel

相关问题 更多 >

    热门问题