Как я могу использовать HTML ловкость , чтобы захватить все между и

c# html-agility-pack html-parsing screen-scraping

Вопрос

Я плохо спросил об этом же проекте на прошлой неделе и не получил никаких предложений. Я постараюсь быть более ясным. Я пытаюсь работать с данными с сайта www.gtin13.com . Например, если вы вводите арахисовое масло в поиск, я пытаюсь получить описание: ** Nabisco Nutter Butter Sandwich Cookies Chocolate Peanut Butter 4 Ct * Размер : Размер: 12 унций GTIN: 0044000003562 * ean : ** 00- 44000-00356-2 upc: 044000003562 и upca: 04400000356. Я попытался использовать nodeCollection с SelectNodes ("<b>") и все, что я получаю, это ошибки. Возможно ли использовать html-агитацию для захвата данных между <b> <br> и, а затем проанализировать между / s? С моим недостатком опыта я просто не могу добиться этого. Не похоже, что на возвращаемой странице есть то, что я считаю истинными узлами. Если html ловкость не может это сделать, может ли кто-нибудь предложить лучший подход? В конце концов, я хотел бы отправить каждую часть данных в таблицу sql. Надеюсь, что я представил это в лучшем смысле.

Страница возвращает информацию в этом исходном формате:

<b><a href="/product/nabisco+nutter+butter+sandwich+cookies+chocolate+peanut+butter+4+ct/">Nabisco Nutter Butter Sandwich Cookies Chocolate Peanut Butter 4 Ct</a></b><br />

Size: 12 oz<br />

GTIN/EAN-13: 0044000003562 / 00-44000-00356-2<br />

UPC-A: 044000003562 / 04400000356<br />



Tags:

<a href="/tag/chocolate/">Chocolate</a>, 

<a href="/tag/cookies/">Cookies</a>, 
 ..<br />

<br >

Принятый ответ

Это не так просто, потому что исходный документ довольно неструктурирован (не используя иерархическую компоновку, но плоскую), но вот как вы можете извлечь основные текстовые поля в Html Agility Pack:

        HtmlDocument doc = new HtmlDocument();
        doc.Load("yourDoc.Htm");

        // Get A nodes that have an HREF attribute
        foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//b/a[@href]"))
        {
            // This will contain anchor's displayed text
            string title = node.InnerText;
            Console.WriteLine("title=" + title);

            // Get the 1st BR, and then it's next sibling of TEXT type.
            HtmlNode sizeNode = node.SelectSingleNode("../following-sibling::br[1]/following-sibling::text()");
            Console.WriteLine(" size=" + sizeNode.InnerText.Trim());

            // Get the 3nd BR, and then it's next sibling of TEXT type.
            HtmlNode eanNode = node.SelectSingleNode("../following-sibling::br[2]/following-sibling::text()");
            Console.WriteLine(" ean=" + eanNode.InnerText.Trim());

            // Get the 3rd BR, and then it's next sibling of TEXT type.
            HtmlNode upcNode = node.SelectSingleNode("../following-sibling::br[3]/following-sibling::text()");
            Console.WriteLine(" upc=" + upcNode.InnerText.Trim());
        }

Это отобразит:

title=Peanut Delight Peanut Butter & Grape Jelly
 size=Size: 18 oz
 ean=GTIN/EAN-13: 0041498143909 / 00-41498-14390-9
 upc=UPC-A: 041498143909 / 04149814390
title=Nabisco Nutter Butter Sandwich Cookie Bites Peanut Butter
 size=Size: 10 oz
 ean=GTIN/EAN-13: 0044000046118 / 00-44000-04611-8
 upc=UPC-A: 044000046118 / 04400004611
title=Nabisco Nutter Butter Sandwich Cookies Chocolate Peanut Butter 4 Ct
 size=Size: 12 oz
 ean=GTIN/EAN-13: 0044000003562 / 00-44000-00356-2
 upc=UPC-A: 044000003562 / 04400000356

и т.д...

ПРИМЕЧАНИЕ. Он не завершен на 100%, так как вам придется анализировать переменную size, ean и upc, используя стандартную манипуляцию строками (IndexOf, Substring и т. Д.) Или Regex, но сторона Html сделана.


Популярные ответы

Используя HTQL, запрос на извлечение всей таблицы со страницы:

<div (CLASS='BGC')>1.<div (CLASS='CON')>1.<div (CLASS='SC')>1.<div (ID='post-20')>1.<div (CLASS='PostContent')>1.<b sep>2-0 {
  title=<a>1:tx; 
  size=/'Size:'~'<br />'/;
  gtin=/'GTIN/EAN-13:'~'<br />'/;
  upc=/'UPC-A:'~'<br />'/;
  tags=/'Tags:'~'<br />'/;
}

Если вам нужно отправить результаты только в базу данных sql, я предлагаю вам использовать веб-скребок IRobotSoft.



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow