Извлечение определенных значений узлов из списка узлов с использованием HtmlAgilityPack в C # - PullRequest
1 голос
/ 05 января 2012

Я сканирую страницу www.thenextweb.com

Я хочу извлечь все ссылки на посты, содержание статьи, изображение статьи и т. Д.

Я написал этот код ...

string url = TextBox1.Text.ToString();
        var webGet = new HtmlWeb();
        var document = webGet.Load(url);

        var infos = from info in document.DocumentNode.SelectNodes("//div[@class='article-listing']")
                    select new
                    {
                        Contr = info.InnerHtml
                    };

        lvLinks.DataSource = infos;
        lvLinks.DataBind();

Это извлекает всю необходимую информацию со страницы ... и я использовал эту информацию на домашней странице, используя элемент управления listview на странице asp.net, как

<li> <%# Eval("Contr") %> </li>

Теперь что яхочу - это способ, которым я могу извлечь информацию об узлах, так как у нас есть все узлы, присутствующие в информация URL ссылки, текст сообщения и т. д.

Я хочу способ, чтобы я могхранить их как URL [0], PostContent [0], PostImage [0], Date [0] и URL [1], PostContent [1] и т. д. Все они содержат уважаемые значения, которые хранятся в этих строках массива ....одно за другим каждое сообщение ...

Это как извлечение информации один за другим из внутренних узлов в информации.

Пожалуйста, предложите способ?

1 Ответ

1 голос
/ 05 января 2012

Почему бы не создать класс, который анализирует HTML и предоставляет эти узлы в качестве свойств.

class ArticleInfo
{
    public ArticleInfo (string html) { ... }
    public string URL { get; set; }
    public string PostContent { get; set; }
    public string PostImage { get; set; }
    public DateTime PostDate { get; set; }
}

Тогда вы могли бы сделать что-то вроде этого:

var infos = from info in document.DocumentNode.SelectNodes("//div[@class='article-listing']")
            select new ArticleInfo(info.InnerHtml);

Тогда, если у вас есть массив этих `infoArray = infos.ToArray () ', вы можете сделать:

infoArray[0].URL
infoArray[0].PostDate
infoArray[1].PostContent

etc...

Обновление

Примерно так:

class ArticleInfo
{
    private string html;

    public ArticleInfo (string html) 
    {
        this.html = html;
        URL = //code to extract and assign Url from html
        PostContent = //code to extract content from html
        PostImage = //code to extract Image from html
        PostDate = //code to extract date from html
    }

    public string URL { get; private set; }
    public string PostContent { get; private set; }
    public string PostImage { get; private set; }
    public DateTime PostDate { get; private set; }

    public string Contr { get { return html; } }
}

или, может быть, это:

class ArticleInfo
{
    private string html;

    public ArticleInfo (string html) 
    {
        this.html = html;
    }

    public string URL { get { return /*code to extract and return Url from html*/; } }
    public string PostContent { get { return /*code to extract and return Content from html*/; } }
    public string PostImage { get { return /*code to extract and return Image from html*/; } }
    public DateTime PostDate { get { return /*code to extract and return Date from html*/; } }

    public string Contr { get { return html; } }
}

Ваш запрос ссылки затем возвращает последовательность ArticleInfo, а не анонимные типы. Таким образом, вам не нужно поддерживать отдельные массивы для каждого элемента поста. Каждый элемент в массиве (или последовательности) имеет свойства, чтобы дать вам связанный элемент из этого элемента. Конечно, это может не соответствовать тому, чего вы пытаетесь достичь. Я просто подумал, что это может быть немного чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...