XPath-Ausdruck funktioniert nicht in HtmlAgilityPack

c# html-agility-pack xpath

Frage

Ich weiß, dass es in XPath von meiner Noobness sein mag, aber lasst mich fragen, um sicherzustellen, dass ich genug gegoogelt habe.

Ich habe eine Website und möchte die Nachrichtenüberschriften davon bekommen: www.farsnews.com (es ist Persisch)

Unter Verwendung von FireBug- und FireXpath-Erweiterungen unter Firefox und von Hand extrahiere und teste ich mehrere Xpath-Ausdrücke, die den Überschriften entsprechen, wie zum Beispiel:

* html/body/div[2]/div[2]/div[2]/div[*]/div[2]/a/div[2]
* .//*[@class="topnewsinfotitle "]
* .//div[@class="topnewsinfotitle "]

Ich habe diese auch mit XPather Extension getestet und sie scheinen ziemlich gut zu funktionieren, aber wenn ich sie testen kann ... gibt SelectNodes null zurück!

Irgendwelche Anhaltspunkte oder Hinweise?

Hier ist ein Teil des Codes:

listBox2.ResetText();

HtmlAgilityPack.HtmlWeb w = new HtmlAgilityPack.HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = w.Load("http://www.farsnews.com");
HtmlAgilityPack.HtmlNodeCollection nc = doc.DocumentNode.SelectNodes(".//div[@class=\"topnewsinfotitle \"]");

listBox2.Items.Add(nc.Count+" Items selected!");

foreach (HtmlAgilityPack.HtmlNode node in nc) {
            listBox2.Items.Add(node.InnerText);
        }

Vielen Dank.

Beliebte Antwort

Ich habe deine Ausdrücke getestet. Und wie Dialecticus in einem Kommentar erwähnt, haben Sie einen Endbereich, der nicht da sein sollte.

//div[@class='topnewsinfotitle ']/text()

Gibt 'leere Sequenz' zurück, siehe Auswertung: http://xmltools.dk/EQA-ACA6

//div[@class='topnewsinfotitle']/text()

Gibt eine Liste Ihrer Überschriften zurück, siehe: http://xmltools.dk/EgA2APAj

Wenn es jedoch andere Klassen geben könnte, verwenden Sie diese ( http://xmltools.dk/EwA8AJAW ):

//div[contains(@class, 'topnewsinfotitle')]/text()

(Ich sehe, dass es sich um ein Codierungsproblem in den von mir bereitgestellten Links handelt. Es sollte jedoch für die Bedeutung keine Rolle spielen und für alle XPath-Ausdrücke können Sie /text() entfernen, um die Knoten anstelle des Textes zu erhalten)

ABER, wenn Sie diese Seite besitzen, sollten Sie die Überschriften mit einem XML (vielleicht RSS oder ATOM) oder JSON versehen, das bessere Leistung hat und, am wichtigsten, kugelsicherer sein kann.



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