Как я могу использовать ловкость html, чтобы захватить все между <b>и <br> - PullRequest
0 голосов
/ 03 апреля 2011

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

Ответы [ 5 ]

1 голос
/ 03 апреля 2011

Используя 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 web scraper.

1 голос
/ 03 апреля 2011

Это не так просто, потому что исходный документ довольно неструктурирован (не с использованием иерархической структуры, а с плоской структурой), но вот как вы можете извлечь основные текстовые поля с помощью пакета 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-стороны все в порядке.

0 голосов
/ 03 апреля 2011

Я бы предложил для этого использовать Regex, так как HtmlAgilityPack, вероятно, захочет иметь правильно сформированные html-теги, как в <b> без </b> - неправильной пары тегов,Вот почему вы получаете ошибки.<br > и <br /> не являются конечным тегом для начального тега <b> (жирный).

Если вы не являетесь генератором HTML, то, как я уже сказал, я бы предложил Regex,и скажите, что хотите все между тегами <b> и <br >.Но так как у вас есть пара разных тегов прерывания, у вас тоже могут быть проблемы с этим.

0 голосов
/ 03 апреля 2011

Я предполагаю, что SelectNodes использует xpath? Поэтому вы должны сделать что-то вроде .. SelectNotes ("// b"), чтобы получить все узлы b.

Вот простые примеры xpath: http://www.w3schools.com/xpath/xpath_syntax.asp

Вы можете выбрать ссылки и посмотреть только те, которые имеют href, начиная с 'product', для группировки узлов?

0 голосов
/ 03 апреля 2011

String Split принимает строки в дополнение к символам:

String[] Sections = HTML.Split(new string[] {"<b>", "<br />"}, StringSplitOptions.RemoveEmptyEntries);
...