HTML Agility Pack Очистка экрана XPATH не возвращает данные - PullRequest
2 голосов
/ 23 марта 2010

Я пытаюсь написать скребок для экрана для Digikey, который позволит нашей компании точно отслеживать цены, доступность запчастей и замену продуктов в случае их снятия с производства. Кажется, существует несоответствие между XPATH, который я вижу в Chrome Devtools, и Firebug в Firefox, и тем, что видит моя программа на C #.

Страница, которую я сейчас очищаю, - http://search.digikey.com/scripts/DkSearch/dksus.dll?Detail&name=296-12602-1-ND

Код, который я сейчас использую, довольно быстрый и грязный ...

   //This function retrieves data from the digikey
   private static List<string> ExtractProductInfo(HtmlDocument doc)
   {
       List<HtmlNode> m_unparsedProductInfoNodes = new List<HtmlNode>();
       List<string> m_unparsedProductInfo = new List<string>();

       //Base Node for part info
       string m_baseNode = @"//html[1]/body[1]/div[2]";

       //Write part info to list
       m_unparsedProductInfoNodes.Add(doc.DocumentNode.SelectSingleNode(m_baseNode + @"/table[1]/tr[1]/td[1]/table[1]/tr[1]/td[1]"));
       //More lines of similar form will go here for more info
       //this retrieves digikey PN

       foreach(HtmlNode node in m_unparsedProductInfoNodes)
       {
           m_unparsedProductInfo.Add(node.InnerText);
       }

       return m_unparsedProductInfo;
   }

Хотя путь, который я использую, кажется «правильным», я продолжаю получать значение NULL, когда смотрю на список «m_unparsedProductInfoNodes»

Есть идеи, что здесь происходит? Я также добавлю, что если я сделаю «SelectNodes» для baseNode, он вернет только div с единственным значимым дочерним элементом - «cs = ####», который, похоже, зависит от пользовательских программ браузера. Если я в любом случае пытаюсь использовать это (помещая / cs = 0 в путь для неидентифицируемого браузера), это приводит к подгонке, настаивающей на том, что мое выражение не оценивается для набора узлов, но оставление их все еще оставляет проблему всех данных прошлых div [2] возвращается как NULL.

Ответы [ 2 ]

0 голосов
/ 26 марта 2010

Только для обновления:

Я перешел с c # на немного более дружественный Python (мой опыт программирования на asm, c и python, все это было совершенно новым), и мне удалось исправить мои проблемы с xpath. Тег был действительно проблемой, но, к счастью, он уникален, поэтому немного регулярного выражения и удаленной строки, и я был в хорошей форме. Я не уверен, почему такой тег нарушает XPATH. Если у кого-то есть понимание, я бы хотел это услышать.

0 голосов
/ 25 марта 2010

Попробуйте использовать это выражение XPath:

/html[1]/body[1]/div[2]/cs=0[1]/rf=141[1]/table[1]/tr[1]/td[1]/table[1]/tr[1]/td[1]

Используя Google Chrome Developer Tools и Firebug в Firefox, кажется, что веб-страница имеет теги 'cs' и 'rf' перед первой таблицей. Что-то вроде:

<cs="0">
  <rf="141">
    <table>
    ...
    </table>
  </rf>
</cs>

Есть кое-что, что может быть полезно знать, что происходит, когда вы хотите проанализировать известный файл HTML, и вы не получаете ожидаемых результатов. В этом случае я просто сделал:

string xpath = "";

//In this case I'll get all cells and see what cell has the text "296-12602-1-ND"

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//td"))
{
    if (node.InnerText.Trim() == "296-12602-1-ND")
        xpath = node.XPath; //Here it is
}

Или вы можете просто отладить приложение после загрузки документа и проходить через каждый дочерний узел, пока не найдете узел, с которого хотите получить информацию. Если вы просто установили точку останова при обнаружении InnerText, вы можете просто просмотреть родителей и продолжить поиск других узлов. Я обычно делаю это, вводя команды вручную в окне «наблюдения» и перемещаясь по дереву, чтобы увидеть свойства, атрибуты и дочерние элементы.

...