Schreiben Sie eine Abfrage, um HTML DOCUMENT mit HtmlAgilityPack zu analysieren

c# html html-agility-pack linq

Frage

Ich möchte die A href dieses Elements in span class = "floatClear" erhalten, deren Bewertung minimal ist
span class = "stern-img stars_4"

Wie kann ich HtmlAgilityPack verwenden, um dieses Verhalten zu erzielen, habe ich die HTML-Quelle meiner Datei angegeben

<div class="businessresult">  //will repeat


      <div class="rightcol">

       <div class="rating">

        <span class="star-img stars_4">
          <img height="325" width="84" src="http://media1.px" alt="4.0 star rating"   **title**="4.0 star rating">
         </span>

        </div>
      </div>

        <span class="floatClear">
             <a class="ybtn btn-y-s" href="/writeareview/biz/KaBw8UEm8u6war_loc%NY">
        </span>
</div>

Die Abfrage, die ich geschrieben habe

var lowestreview = 
      from main in htmlDoc.DocumentNode.SelectNodes("//div[@class='rightcol']") 
       from rating in htmlDoc.DocumentNode.SelectNodes("//div[@class='rating']")
         from ratingspan in htmlDoc.DocumentNode.SelectNodes("//span[@class='star-img stars_4']")
          from floatClear in htmlDoc.DocumentNode.SelectNodes("//span[@class='floatClear']")
       select new { Rate = ratingspan.InnerText, AHref = floatClear.InnerHtml };

Aber ich weiß nicht, wie man die Bedingung hier in der letzten Zeile der LINQ-Abfrage anwendet!

Akzeptierte Antwort

Wählen Sie nicht "Bewertung" aus dem gesamten htmlDoc, wählen Sie es aus dem zuvor gefundenen "main" aus.

Ich schätze, du brauchst etwas wie:

var lowestreview = 
  from main in htmlDoc.DocumentNode.SelectNodes("//div[@class='rightcol']") 
   from rating in main.SelectNodes("//div[@class='rating']")
     from ratingspan in rating.SelectNodes("//span[@class='star-img stars_4']")
      from floatClear in ratingspan.SelectNodes("//span[@class='floatClear']")
   select new { Rate = ratingspan.InnerText, AHref = floatClear.InnerHtml };

Ich hoffe, dass es nicht zum Absturz kommt, wenn einige dieser divs und spans nicht vorhanden sind: Eine vorherige Version von HtmlAgilityPack gab null statt einer leeren Liste zurück, wenn die SelectNodes nichts gefunden haben.

BEARBEITEN
Wahrscheinlich müssen Sie auch die "xpath query" für die inneren Selects ändern: Ändern Sie "//" in ".//" (extra. Am Anfang), um zu signalisieren, dass Sie wirklich einen Unterknoten wollen. Wenn das AgilityPack genauso funktioniert wie regulärer XML-XPath (ich bin mir nicht 100% sicher), sucht ein "//" am Anfang des Dokuments nach dem Stamm des Dokuments, auch wenn Sie es aus einem Unterknoten heraus spezifizieren. Ein "./" sucht immer nach dem Knoten, von dem Sie suchen.

Ein main.SelectNodes("//div[@class='rating']") wird (wahrscheinlich) auch <div class="rating"> s außerhalb des <div class="rightcol"> finden, das Sie in der vorherigen Zeile gefunden haben . Ein main.SelectNodes(".//div[@class='rating']") sollte das beheben.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum