【问题标题】:reading text from multiple table cells with same class names从具有相同类名的多个表格单元格中读取文本
【发布时间】:2018-09-03 16:25:31
【问题描述】:

我需要从网站中抓取特定信息。列出了不同的人,1 人的 html 看起来像这样:

<table class="novip">
        <tbody><tr class="novip">
          <td class="novip-portrait-picture" rowspan="5">
            <a class="novip-portrait-picture" href="###">
              <img class="novip-portrait-picture" src="/img/general/default/portrait/cat/default-portrait_m.jpg" alt="Noch kein Bild" onerror="portrait_m_image_failover(this)">
            </a>
          </td>
          <td class="novip-left">
            <a class="novip-firmen-name" href="###" target="_top">
              Dubler&nbsp;Martin
            </a>
          </td>
          <td class="novip-right" rowspan="2">
            <a class="novip" href="/arzt/dubler-martin-bad-zurzach-5330-arzt.html">
              <img class="novip-right" src="/pictures/31814/web/small/31814.png">
            </a>
          </td>
        </tr>
        <tr class="novip">
          <td class="novip-left">
            <span class="novip-left-titel">
              Dr. med. 
            </span>
            <span class="novip-left-fachbezeichnung">
              Facharzt FMH für Allgemeinmedizin, Reiseme
              <a class="novip-left-fachbezeichnung" href="/arzt/dubler-martin-bad-zurzach-5330-arzt.html">
                ...
              </a>
            </span>
            <br>
            address...
            <br>
            Tel:&nbsp;056 249 27 77
            &nbsp;&nbsp; 
        </td></tr>       
      </tbody></table>

我需要 novip-firmen-namenovip-left-titelnovip-left-fachbezeichnung 类中的文本。

我尝试了以下方法:

request('url', (error, response, html)=>{
if(!error && response.statusCode == 200){
    const $ = cheerio.load(html);

    $('table .novip').each(function(i, value){

        var fullname = $(value).find('.novip-firmen-name').text();
        console.log(fullname);

        var link = $(value).find('.novip-firmen-name').attr('href');
        console.log(link);

        var title = $(value).find('.novip-left-titel').text();
        console.log(title);

        var fachbezeichnung = $(value).find('.novip-left-fachbezeichnung').text();
        console.log(fachbezeichnung);

        console.log('----------------------------------');

    }); 


}
else console.log("error");
});

它似乎工作正常,但有时由于某种原因它记录未定义。此外,我觉得有一种更简单的方法可以获取上面列出的信息。我以前从未使用过 js 和 Cheerio,因此感谢您提供任何帮助。谢谢

PS:如果您需要网站链接或更多html,请告诉我。

【问题讨论】:

  • 如果“.novip-firmen-name”类每个表来一次,您可以直接获取具有类名的元素。而不是每次都使用 find ,只需将引用保留在变量中 1 次并使用它。

标签: javascript node.js web-scraping cheerio


【解决方案1】:

你得到undefined,因为对于每个表td,它都会尝试找到.novip-firmen-nameetc。你要做的就是检查这些元素是否存在于表数据中,像这样。

$('table .novip').each(function(){
  if($(this).find('.novip-firmen-name').length !== 0) {
    console.log($(this).find('.novip-firmen-name').text());
    console.log($(this).find('.novip-firmen-name').attr('href'));
  }

  if($(this).find('.novip-left-titel').length !== 0){
    console.log($(this).find('.novip-left-titel').text());
  }

  if($(this).find('.novip-left-fachbezeichnung').length !== 0){
    console.log($(this).find('.novip-left-fachbezeichnung').text());
  }

  console.log('----------------------------------');

}); 

【讨论】:

  • 这解决了未定义的问题。它仍然无法正确获取所有值。在以下格式中仅表示一次:名称,链接,标题,fachbezeichnung,如果不存在则为空。然后跟随“-----------------”并在下一个条目中重复。我不确定为什么它不能按预期工作。网站链接:doktor.ch/aerzte/aerzte_k_ag.html
猜你喜欢
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
  • 2012-04-21
  • 2018-02-06
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多