如何只使用nokogiri访问特定项目而不是所有页面

时间:2016-06-19 17:12:35

标签: ruby nokogiri

我试图使用Nokogiri从网站上搜集一些信息。

网站看起来像这样:

<div class="content">
  <article class="mainarticle">
    <div class="breadcrump">
      <ul></ul>
    </div>
    <div class="boxstyle">
      <h2 style="margin-top:0.1em;">Fahrschulen mit Namen "Hugis Fahrschule AG"</h2>
    </div>
    <section class="leftrightleft  ">
      <header>
        <div class="borderright borderbottom pads">
          <figure class="logoschule">
            <a href="fahrlehrerbilder.php?irat_id=14581" onclick="showGallery('irat_gallery',14581);return false;">
              <img alt="Bilder Hugis Fahrschule AG" width="110" height="110" src="http://www.fahrlehrervergleich.ch/images/lehrer/small/fe1774780ba2d3aaa3e985ee960bf8.jpg">
              <figcaption class="gallerylabel minhide">1 Bild</figcaption>
            </a>
          </figure>
          <div>
            <h3><a href="http://www.fahrlehrervergleich.ch/fahrschule-Hugis-Fahrschule-AG-Z%C3%BCrich-fahrschule-14581.htm" target="_self" title="Hugis Fahrschule AG">Hugis Fahrschule AG</a></h3>
            <h4 style="padding:0;line-height:1.3em;">Thomas  Hugelshofer</h4>
            <span class="biger">Thomas  Hugelshofer</span>
            <p><span>Oerlikon</span><br><span>Schaffhauserstrasse 443</span><br><span>8050</span> <span>Zürich</span></p>
            <p><a href="karte.php?i=14581" target="_blank" onclick="showMap(14581);return false;">Karte</a> &nbsp;<a href="streetview.php?i=14581" target="_blank" onclick="showStreetview(14581);return false;">Streetview</a> &nbsp;</p>
            <p></p>
          </div>
          <table class="eintraegemain clearfix">
            <tbody>
              <tr>
                <td>Homepage:</td>
                <td><a href="fahrlehrervergleich.php?web=14581" target="_blank"><span>www.hugis-fahrschule.ch</span></a></td>
              </tr>
              <tr>
                <td>E-Mail:</td>
                <td><a class="" href="kontakt_user.php?kontakt_id=14581" target="_blank" onclick="showEmailSender(14581);return false;">sekretariat@hugis-fahrschule.ch</a></td>
              </tr>
              <tr>
                <td>Natel:</td>
                <td><span>076 684 11 11</span></td>
              </tr>
            </tbody>
          </table>
        </div>
      </header>
      <div class="accordion">
        <div class="accordion-section">
          <a class="accordion-section-title  accordeonfarbe-00" href="#accordion-1-14581"><span class="arrow"></span>Preise für Auto: ab 74.-, Auto Automat: ab 74.-, Motorrad: 90...</a>
          <section id="accordion-1-14581" class="secondright accordion-section-content">
            <div class="borderleft pads">
              <table>
                <tbody>
                  <tr>
                    <td>Kategorien</td>
                    <td>Preise CHF</td>
                  </tr>
                  <tr>
                    <td>Auto:</td>
                    <td>ab 74.-</td>
                  </tr>
                  <tr>
                    <td>Auto&nbsp;Automat:</td>
                    <td>ab 74.-</td>
                  </tr>
                  <tr>
                    <td>Motorrad:</td>
                    <td>90.-</td>
                  </tr>
                  <tr>
                    <td>Taxi:</td>
                    <td>74.-</td>
                  </tr>
                  <tr>
                    <td>Lastwagen:</td>
                    <td>165 .-</td>
                  </tr>
                  <tr>
                    <td>Lastwagen&nbsp;C1:</td>
                    <td>165.-</td>
                  </tr>
                  <tr>
                    <td>Auto&nbsp;Anhänger:</td>
                    <td>112.-</td>
                  </tr>
                  <tr>
                    <td>LKW&nbsp;Anhänger:</td>
                    <td>195.-</td>
                  </tr>
                  <tr>
                    <td>Car:</td>
                    <td>195.-</td>
                  </tr>
                  <tr>
                    <td style="font-weight:normal;">Lektionsdauer:</td>
                    <td style="font-weight:normal;">45 Minuten</td>
                  </tr>
                </tbody>
              </table>
              <table>
                <tbody>
                  <tr>
                    <td>Kurse</td>
                    <td>Preise CHF</td>
                  </tr>
                  <tr>
                    <td>Verkehrskunde:</td>
                    <td>150.-</td>
                  </tr>
                  <tr>
                    <td>Nothelferkurs:</td>
                    <td>120.-</td>
                  </tr>
                  <tr>
                    <td>Motorrad&nbsp;Grundkurs:</td>
                    <td>160 pro Teil</td>
                  </tr>
                  <tr>
                    <td>Theorie:</td>
                    <td>Nach Anmeldung</td>
                  </tr>
                </tbody>
              </table>
            </div>
          </section>
        </div>
        <div class="accordion-section">
          <a class="accordion-section-title  accordeonfarbe-00" href="#accordion-2-14581"><span class="arrow"></span>Weitere Informationen: Sprachen: Deutsch, Englisch...</a>
          <section id="accordion-2-14581" class="thirdleft accordion-section-content">
            <div class="borderright pads">
              <table id="sb_14581">
                <tbody>
                  <tr>
                    <td>Sprachen: </td>
                    <td>Deutsch, Englisch, Serbisch, Albanisch, Türkisch, Polnisch, Italienisch</td>
                  </tr>
                  <tr>
                    <td>Autotyp:</td>
                    <td>Renauld Megan</td>
                  </tr>
                  <tr>
                    <td>Administration:</td>
                    <td>CHF 110.-  (pauschal)</td>
                  </tr>
                  <tr>
                    <td>Jahrgang:</td>
                    <td>2015</td>
                  </tr>
                  <tr>
                    <td>Ausbildungsjahr:</td>
                    <td>2015</td>
                  </tr>
                </tbody>
                <tbody></tbody>
              </table>
            </div>
          </section>
        </div>
        <footer class="clearfix">
          <section>
            <div class="bordertop pads" id="sbwl_14581">
              <div class="ratingoutside">
                <ul class="rating">
                  <li class="icon icon-star-two"></li>
                  <li class="icon icon-star-two"></li>
                  <li class="icon icon-star-two"></li>
                  <li class="icon icon-star-two"></li>
                  <li class="icon icon-star-two"></li>
                  <li class="icon icon-star-two"></li>
                  <li><a href="bewertungen.php?irat=14581" onclick="showBewe(14581);return false;" title="12 Bewertungen anschauen" style="text-decoration:none;">(12)</a></li>
                </ul>
              </div>
              <div class="rightbuts"><a class="buttonsmall" href="bewertungen.php?irat=14581" onclick="showBewe(14581);return false;" title="Bewertungen anschauen">Bewertungen anschauen</a>
                <a class="buttonsmall" href="lernen/index.php?bewe_irat=14581">Fahrlehrer bewerten</a>
              </div>
              <p class="clicks minhide clearfix"> 30-Tage-Statistik  : Inserat <span class="num_imp">14069</span> Mal angezeigt, Homepage <span class="num_click">228</span> Mal angeklickt.  (<a href="sponsored.php" target="_blank" onclick="loadSponsored();return false;">sponsored</a>)</p>
            </div>
          </section>
        </footer>
      </div>
    </section>
    <section class="leftrightleft  ">
      <header>
        <div class="borderright borderbottom pads">
          <div>
            <h3><a href="http://www.fahrlehrervergleich.ch/fahrschule-Hugis-Fahrschule-AG-Adlikon+b.+Regensdorf-fahrschule-13695.htm" target="_self" title="Hugis Fahrschule AG">Hugis Fahrschule AG</a></h3>
            <h4 style="padding:0;line-height:1.3em;">Thomas  Hugelshofer</h4>
            <span class="biger">Thomas  Hugelshofer</span>
            <p><span>8106</span> <span>Adlikon b. Regensdorf</span></p>
          </div>
          <table class="eintraegemain clearfix">
            <tbody></tbody>
          </table>
        </div>
      </header>
      <div class="accordion">
        <div class="accordion-section">
          <a class="accordion-section-title  accordeonfarbe-00" href="#accordion-1-13695"><span class="arrow"></span>Preise für Auto: 84.-, Motorrad: 90.-, Taxi: 95.-, Lastwagen:...</a>
          <section id="accordion-1-13695" class="secondright accordion-section-content">
            <div class="borderleft pads">
              <table>
                <tbody>
                  <tr>
                    <td>Kategorien</td>
                    <td>Preise CHF</td>
                  </tr>
                  <tr>
                    <td>Auto:</td>
                    <td>84.-</td>
                  </tr>
                  <tr>
                    <td>Motorrad:</td>
                    <td>90.-</td>
                  </tr>
                  <tr>
                    <td>Taxi:</td>
                    <td>95.-</td>
                  </tr>
                  <tr>
                    <td>Lastwagen:</td>
                    <td>165.-</td>
                  </tr>
                  <tr>
                    <td>Lastwagen&nbsp;C1:</td>
                    <td>165.-</td>
                  </tr>
                  <tr>
                    <td>Auto&nbsp;Anhänger:</td>
                    <td>112.-</td>
                  </tr>
                  <tr>
                    <td>LKW&nbsp;Anhänger:</td>
                    <td>195.-</td>
                  </tr>
                  <tr>
                    <td>Car:</td>
                    <td>195.-</td>
                  </tr>
                </tbody>
              </table>
              <table>
                <tbody>
                  <tr>
                    <td>Kurse</td>
                    <td>Preise CHF</td>
                  </tr>
                  <tr>
                    <td>Verkehrskunde:</td>
                    <td>150.-</td>
                  </tr>
                  <tr>
                    <td>Motorrad&nbsp;Grundkurs:</td>
                    <td>160.-</td>
                  </tr>
                </tbody>
              </table>
            </div>
          </section>
        </div>
        <div class="accordion-section">
          <a class="accordion-section-title  accordeonfarbe-00" href="#accordion-2-13695"><span class="arrow"></span>Weitere Informationen: Sprachen: Deutsch, Englisch...</a>
          <section id="accordion-2-13695" class="thirdleft accordion-section-content">
            <div class="borderright pads">
              <table id="sb_13695">
                <tbody>
                  <tr>
                    <td>Sprachen: </td>
                    <td>Deutsch, Englisch, Französisch, Italienisch, Polnisch, Türkisch</td>
                  </tr>
                  <tr>
                    <td>Autotyp:</td>
                    <td>VW, BMW, MAN, SETRA, </td>
                  </tr>
                </tbody>
                <tbody></tbody>
              </table>
            </div>
          </section>
        </div>
        <footer class="clearfix">
          <section>
            <div class="bordertop pads" id="sbwl_13695">
              <div class="ratingoutside">
                <ul class="rating">
                  <li class="icon icon-star-two"></li>
                  <li class="icon icon-star-two"></li>
                  <li class="icon icon-star-two"></li>
                  <li class="icon icon-star-two"></li>
                  <li class="icon icon-star-two"></li>
                  <li class="icon icon-star-two"></li>
                  <li><a href="bewertungen.php?irat=13695" onclick="showBewe(13695);return false;" title="12 Bewertungen anschauen" style="text-decoration:none;">(12)</a></li>
                </ul>
              </div>
              <div class="rightbuts"><a class="buttonsmall" href="bewertungen.php?irat=13695" onclick="showBewe(13695);return false;" title="Bewertungen anschauen">Bewertungen anschauen</a>
                <a class="buttonsmall" href="lernen/index.php?bewe_irat=13695">Fahrlehrer bewerten</a>
              </div>
              <p class="clicks minhide clearfix"> 30-Tage-Statistik  : Inserat 307 Mal angezeigt. </p>
            </div>
          </section>
        </footer>
      </div>
    </section>
    <ul class="paginator"></ul>
    <section class="texttabs clearfix">
      <p>
        Fahrschulen in der Schweiz: Fahrschulen und Fahrlehrer für Auto, Motorrad, Lastwagen, Taxi und Boot. Verkehrskunde (VKU), Nothelferkurs, Motorradgrundkurs. Informationen zu Strassenverkehrsamt, Lernfahrausweis, Fahrprüfung, WAB hier im Schweizer Fahrlehrervergleich.                          
      </p>
      <p>
        Der Schweizer Fahrlehrervergleich gibt Auskunft über Fahrschulen und Fahrlehrer, die in folgenden Kategorien unterrichten: Auto, Motorrad, Lastwagen, Taxi und Boot. Ebenfalls werden Angaben über Verkehrtheorie, Motorradgrundkurs, Nothelferkurs und Theorietraining gemacht. Finden Sie eine Auto-, Motorrad- oder Lastwagen-Fahrschule, Informationen zu Ausbildung, Grundkurs, Theoriekurs, Schleuderkurs und Autoprüfung. Fahrschule Fahrschulen Fahrlehrer Zürich Bern Basel Luzern Aargau Schweiz. Der Schweizer Fahrlehrervergleich beinhaltet über 5000 Fahrschulen und Fahrlehrer aus der ganzen Schweiz.                           
      </p>
    </section>
  </article>
  <aside>
    <h2>Fahrlehrer und Fahrschulen finden</h2>
    <section class="filterbox regone boxstyle">
      <h3>Fahrschulen </h3>
      <ul>
        <li><a title="Fahrschule Hugis Fahrschule AG" href="http://www.fahrlehrervergleich.ch/fahrschule-Hugis-Fahrschule-AG-Z%C3%BCrich-fahrschule-14581.htm">Hugis Fahrschule AG</a></li>
        <li><a title="Fahrschule Hugis Fahrschule AG" href="http://www.fahrlehrervergleich.ch/fahrschule-Hugis-Fahrschule-AG-Adlikon+b.+Regensdorf-fahrschule-13695.htm">Hugis Fahrschule AG</a></li>
      </ul>
    </section>
    <section class="filterbox regone boxstyle">
      <h3>Sprachauswahl</h3>
      <ul>
        <li><a hreflang="de" href="http://www.fahrlehrervergleich.ch" title="Schweizer Fahrlehrervergleich">Schweizer Fahrlehrervergleich</a></li>
        <li><a hreflang="fr" href="http://auto-ecole.comparatif.ch" title="Comparatif d'auto-écoles suisses">Comparatif d'auto-écoles suisses</a></li>
        <li><a hreflang="it" href="http://autoscuola.comparazione.ch" title="Confronto delle autoscuole svizzere">Confronto delle autoscuole svizzere</a></li>
        <li><a hreflang="en" href="http://driving-instructor.fahrlehrervergleich.ch" title="Swiss Driving Instructors">Swiss Driving Instructors</a></li>
      </ul>
    </section>
    <section class="filterbox regone boxstyle">
      <h3>Siehe auch...</h3>
      <ul>
        <li>
          <a href="http://www.zahnarztvergleich.ch" title="Schweizer Zahnarztvergleich">
          Schweizer Zahnarztvergleich                           </a>
        </li>
        <li>
          <a href="http://www.treuhandvergleich.ch" title="Schweizer Treuhandvergleich">
          Schweizer Treuhandvergleich                           </a>
        </li>
        <li>
          <a href="http://www.anwaltvergleich.ch" title="Schweizer Anwaltvergleich">
          Schweizer Anwaltvergleich                         </a>
        </li>
        <li>
          <a href="http://www.coiffeurvergleich.ch" title="Schweizer Coiffeurvergleich">
          Schweizer Coiffeurvergleich                           </a>
        </li>
      </ul>
    </section>
  </aside>
</div>

我的代码如下所示:

doc = Nokogiri::HTML(page)
doc.css(".leftrightleft").each do |item|
  title = item.at_css("h3 a").text
  address = item.at_css(".biger+ p , h3+ p")
  address.search('br').each do |n|
    n.replace(" ")
  end
  address = address.text

  puts "-----"
  puts title
  puts "Address:"
  puts address
  puts "Course Types:"

  item.css("table+ table tr+ tr").each do |type_price|
    if type_price.css("td")[0] && type_price.css("td")[1] != nil
      course_type = type_price.css("td")[0].text
      course_type.gsub!(":", "")
      price = type_price.css("td")[1].text
      puts "\t #{course_type}: #{price}"
    end
  end
end

问题是,当我item.css("table+ table tr+ tr").each do |type_price|执行此操作时,它会针对该项下的所有项目执行此操作,而不仅仅针对特定项目。

有人可以解释一下我做错了吗?

2 个答案:

答案 0 :(得分:0)

我看了一眼,似乎Nokogiri因为奇怪的标记而混淆了元素。

切换到HTML5可能是最好的选择:

Return Date

我应该说libxml正在进行混乱而不是Nokogiri。

答案 1 :(得分:0)

我找到了解决这个问题的方法。

不是像这个item.at_css("table+ table tbody").css("tr+ tr").each那样制作循环,而是让它循环到从项目到页面结尾的所有页面,我就像这样// in your view @include('some.directory.for.partials', ['softDelete' => 'false']) // you can change this to any value // partial can then run something like this: @if(count($softDelete) || $softDelete) ... @else ... @endif

使用这个解决方案,我只得到第一个表元素,然后循环遍历其余行,它就可以工作。