Очистка веб-страницы с помощью C # и HTMLAgility - PullRequest
5 голосов
/ 16 марта 2011

Я читал, что HTMLAgility 1.4 - отличное решение для очистки веб-страницы.Будучи новым программистом, я надеюсь, что смогу внести свой вклад в этот проект.Я делаю это как форму заявки AC #.Страница, с которой я работаю, довольно прямолинейна.Информация, которая мне нужна, застряла между двумя тегами и.Моя цель состоит в том, чтобы вытащить данные для Part-Num, Manu-Number, Description, Manu-Country, Last Modified, Last Modified By со страницы и отправить данные в таблицу sql.Одним из недостатков является то, что есть также небольшая картинка в формате png, которую также нужно извлечь из src = "/ partcode / number.

У меня нет готового кода, который работает.скажите мне, направляюсь ли я в правильном направлении. Даже вступая в отладку, я не вижу, что она что-то делает. Может ли кто-нибудь указать мне правильное направление на это.многому научиться. Спасибо, я был бы очень признателен.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HtmlAgilityPack;
using System.Xml;

namespace Stats
{
    class PartParser
    {
        static void Main(string[] args)
        {
            HtmlDocument doc = new HtmlDocument();
            doc.LoadHtml("http://localhost");//my understanding this reads the entire page in?
            var tables = doc.DocumentNode.SelectNodes("//table");// I assume that this sets up the search for words containing table

        }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.WriteLine(ex.StackTrace);
                Console.ReadKey();    
            }
        }
    }
}

Код сети:

<!DOCTYPE html 
     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>Part Number Database: Item Record</title>
<table class="data">
<tr><td>Part-Num</td><td width="50"></td><td><img src="/partcode/number/072140" alt="072140"/></td></tr>
<tr><td>Manu-Number</td><td width="50"></td><td><img src="/partcode/manu/00721408" alt="00721408" /></td></tr>    
<tr><td>Description</td><td></td><td>Widget 3.5</td></tr>
<tr><td>Manu-Country</td><td></td><td>United States</td></tr>    
<tr><td>Last Modified</td><td></td><td>26 Jan 2009,  8:08 PM</td></tr>    
<tr><td>Last Modified By</td><td></td><td>Manu</td></tr>
</table>
<p>
</body>
</html>

Ответы [ 3 ]

6 голосов
/ 16 марта 2011

Начальная часть отключена:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml("http://localhost");   

LoadHtml(html) загружает HTML-строку в документ, я думаю, что вы хотите что-то вроде этого:

HtmlWeb htmlWeb = new HtmlWeb();
HtmlDocument doc  = htmlWeb.Load("http://stackoverflow.com");
6 голосов
/ 16 марта 2011

Проверьте эту статью на 4GuysFromRolla

http://www.4guysfromrolla.com/articles/011211-1.aspx

Это статья, которую я использовал в качестве отправной точки для HTML Agility Pack, и она отлично работает. Я уверен, что из этой статьи вы получите всю необходимую информацию для выполнения задач, которые вы пытаетесь выполнить.

4 голосов
/ 28 марта 2011

Рабочий код, согласно предоставленному вами источнику HTML.Это может быть разложено, и я не проверяю значения null rows, cells и каждое значение внутри case).Если у вас есть страница в 127.0.0.1 , это будет работать.Просто вставьте его в Main метод Консольного приложения и попытайтесь понять его.

HtmlDocument doc = new HtmlWeb().Load("http://127.0.0.1");    

var rows = doc.DocumentNode.SelectNodes("//table[@class='data']/tr");
foreach (var row in rows)
{
    var cells = row.SelectNodes("./td");
    string title = cells[0].InnerText;
    var valueRow = cells[2];
    switch (title)
    {
        case "Part-Num":
            string partNum = valueRow.SelectSingleNode("./img[@alt]").Attributes["alt"].Value;
            Console.WriteLine("Part-Num:\t" + partNum);
            break;
        case "Manu-Number":
            string manuNumber = valueRow.SelectSingleNode("./img[@alt]").Attributes["alt"].Value;
            Console.WriteLine("Manu-Num:\t" + manuNumber);
            break;
        case "Description":
            string description = valueRow.InnerText;
            Console.WriteLine("Description:\t" + description);
            break;
        case "Manu-Country":
            string manuCountry = valueRow.InnerText;
            Console.WriteLine("Manu-Country:\t" + manuCountry);
            break;
        case "Last Modified":
            string lastModified = valueRow.InnerText;
            Console.WriteLine("Last Modified:\t" + lastModified);
            break;
        case "Last Modified By":
            string lastModifiedBy = valueRow.InnerText;
            Console.WriteLine("Last Modified By:\t" + lastModifiedBy);
            break;
    }
}
...