Разбор html -> xml и запрос с помощью Xpath

Я хочу проанализировать html-страницу, чтобы получить некоторые данные. Сначала я конвертирую его в XML-документ с помощью SgmlReader . Затем я загружаю результат в XMLDocument и затем просматриваю XPath:

//contains html document
var loadedFile = LoadWebPage();

...

Sgml.SgmlReader sgmlReader = new Sgml.SgmlReader();
sgmlReader.DocType = "HTML";
sgmlReader.WhitespaceHandling = WhitespaceHandling.All;
sgmlReader.CaseFolding = Sgml.CaseFolding.ToLower;

sgmlReader.InputStream = new StringReader(loadedFile);

XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true;
doc.XmlResolver = null;
doc.Load(sgmlReader);

Этот код отлично работает в большинстве случаев, кроме этого сайта - www.arrow.com (попробуйте найти что-то вроде OP295GS). Я могу получить таблицу с результатом, используя следующий XPath:

var node = doc.SelectSingleNode(".//*[@id='results-table']");

Это дает мне узел с несколькими дочерними узлами:

[0]         {Element, Name="thead"}  
[1]         {Element, Name="tbody"}  
[2]         {Element, Name="tbody"}  
FirstChild   {Element, Name="thead"}

Хорошо, давайте попробуем получить некоторые дочерние узлы с помощью XPath. Но это не работает:

var childNodes = node.SelectNodes("tbody");
//childnodes.Count = 0

Это также:

var childNode = node.SelectSingleNode("thead");
// childNode = null

И даже такое:

var childNode = doc.SelectSingleNode(".//*[@id='results-table']/thead")

Что может быть не так в запросах Xpath?


Я только что попытался разобрать эту HTML-страницу с помощью Html Agility Pack , и мои запросы XPath работают хорошо. Но мое приложение использует внутри XmlDocument, Html Agility Pack мне не подходит.


Я даже попробовал следующий трюк с Html Agility Pack , но запросы Xpath также не работают :

//let's parse and convert HTML document using HTML Agility Pack and then load
//the result to XmlDocument
HtmlDocument xmlDocument = new HtmlDocument();
xmlDocument.OptionOutputAsXml = true;
xmlDocument.Load(new StringReader(webPage));

XmlDocument document = new XmlDocument();
document.LoadXml(xmlDocument.DocumentNode.InnerHtml);

Возможно, var line = "drwxr -...

Приведенный ниже фрагмент определяет из списка файлов, которые из них являются каталогом на FTP

, поскольку C # это будет, как показано ниже

var files = new List(){"App_Data", "bin", "Content"};
var line = "drwxr-xr-x 1 ftp ftp              0 Mar 18 22:41 App_Data"
var dir = files.First(x => line.EndsWith(x));

Как я могу преобразовать последнюю строку в PowerShell?

39
задан ruslander 19 March 2011 в 04:45
поделиться