Извлечение метаданных авторов с XPath - PullRequest
0 голосов
/ 27 мая 2019

У меня есть серия HTML-файлов, в которых имена авторов делятся на имена и фамилии, содержащиеся в метатегах.

Моя текущая HTML-структура выглядит следующим образом. Я хочу правильно извлечь имена и фамилии авторов, чтобы использовать эти данные для индексации этих HTML-файлов. Количество авторов может варьироваться в зависимости от HTML-документов.

<!doctype html>  
 <html lang="en">  
 <head>
 <title>Title of document</title>
 <meta charset="utf-8" />  
 <meta name="dcterms.title" content="The science papers title" />  

<meta name="author" />
    <meta name="firstname" content="Eddard" />
    <meta name="lastname" content="Stark" />

<meta name="author" />
    <meta name="firstname" content="Tywin" />
    <meta name="lastname" content="Lannister" />

<meta name="author" />
    <meta name="firstname" content="Jon" />
    <meta name="lastname" content="Snow" />

 <meta name="dcterms.subject" content="The articles subject" />  
 <meta name="description" content="The articles description, abstract or introduction" />  
 <meta name="keywords" content="keyword1, keyword2, keyword3" />
</head>  

Я использую C # и XPath для очистки этих данных, пытаясь выяснить, как получить правильные данные. Моя проблема в том, что я не могу понять, как извлечь метаданные и сделать так, чтобы я мог использовать каждую строковую переменную для генерации XML позже.

var author_1: Eddard Stark
var author_2: Tywin Lannister
var author_3: Jon Snow

Мой текущий тестовый стенд C # с XPaths.

            var url = "<URL TO DOCUMENT>";     
            var web = new HtmlWeb();
            var doc = web.Load(url);
            var navigator = (HtmlAgilityPack.HtmlNodeNavigator)doc.CreateNavigator();

            // Xpaths
            var authors_list = doc.DocumentNode.SelectSingleNode("//meta[@name='author']");
            var authors_FirstName = "//meta[@name='author']/following::meta[1]/@content";
            var authors_LastName = "//meta[@name='lastname']/@content";

            // Laboratory
            var listOfAuthorsXpath = "//meta[@name='author']/following::meta[1]/@content";
            var nodes = doc.DocumentNode.SelectNodes(listOfAuthorsXpath);

            // SelectNodes
            var firstName = navigator.SelectSingleNode(authors_FirstName);
            var lastName = navigator.SelectSingleNode(authors_LastName);

            // Print to screen
            Console.WriteLine(firstName.Value + " " +lastName.Value);

            //Console.WriteLine(doc.DocumentNode.InnerHtml);
            Console.ReadKey();

1 Ответ

1 голос
/ 27 мая 2019

[Обновленный ответ]
(Обратите внимание, что отправляемый вами XML-файл не является допустимым XML, отсутствует </html>)

С помощью этого фрагмента вы можете получить необходимую информацию:

using System;
using System.Collections.Generic;
using System.Xml;

namespace XPath
{
    class MainClass
    {
        public static void Main()
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(".... your file");

            // Xpaths
            XmlNode root = doc.DocumentElement;
            // Xpaths
            XmlNode root = doc.DocumentElement;
            XmlNodeList xmlFirstNameNodeList = root.SelectNodes("//html/head/meta[@name='firstname']");
            XmlNodeList xmlLastNameNodeList = root.SelectNodes("//html/head/meta[@name='lastname']");

            List<String> authors = new List<String>();

            for(int i=0; i<xmlFirstNameNodeList.Count; i++) {
                authors.Add(xmlFirstNameNodeList[i].Attributes["content"].Value + " " + xmlLastNameNodeList[i].Attributes["content"].Value);
            }

            Console.ReadKey();

        }
    }
}

Содержание списка авторов:

authors[0] = "Eddard Stark"
authors[1] = "Tywin Lannister"
authors[2] = "Jon Snow"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...