получить доступ к ссылкам на вакансии (href?) на Dice.Com, используя C - PullRequest
0 голосов
/ 04 ноября 2018

Я работаю над студенческим проектом, в котором мне поручено проанализировать сообщения о поиске работы в Интернете из Dice.Com. самая важная часть - это описание работы, но я не могу понять, как получить к нему доступ. У меня нет опыта в HTML и очень мало в C #. Когда вы открываете веб-сайт, вы видите каждую публикацию вакансии, затем должны щелкнуть название вакансии, и она открывает новую страницу, чтобы показать все детали. Как я могу получить доступ к этой следующей странице, чтобы иметь возможность записать детали в консоль. Вот то, что я пока имею, очень просто.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
using HtmlAgilityPack;
using System.Text.RegularExpressions;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support;
using OpenQA.Selenium;
using System.Collections;
using System.Xml.Linq;
using OpenQA.Selenium.Support.UI;
    namespace WebScaper
    {`enter code here`
        class Program
        {
            static void Main(string[] args)
            {
                GetHtmlAsync();
                Console.ReadLine();
                var driver = new ChromeDriver();
            }
            static async void GetHtmlAsync()
            {

                var url = "https://www.dice.com/jobs? 
                           q=information+technology&l=arkansas#dice";
                var httpclient = new HttpClient();
                var html = await httpclient.GetStringAsync(url);


                var htmlDocument = new HtmlDocument();
                htmlDocument.LoadHtml(html);



                var JobsHtml = htmlDocument.DocumentNode.Descendants("div")
                  .Where(node => node.GetAttributeValue("id", "")
                   .Equals("search-results-control")).ToList();

                var JobsListItems = JobsHtml[0].Descendants("div")
                    .Where(node => node.GetAttributeValue("class", "")
                        .Contains("complete-serp-result-div")).ToList();


                foreach (var JobListItem in JobsListItems)
                {

                    Console.WriteLine("Company Name:" + " " + JobListItem.Descendants("span")
               .Where(node => node.GetAttributeValue("class", "")
               .Contains("compName")).FirstOrDefault().InnerText.Trim('\r', '\n', '\t'));

                    Console.WriteLine("Job Title:" + " " + JobListItem.Descendants("span")
                    .Where(node => node.GetAttributeValue("itemprop", "")
                    .Contains("title")).FirstOrDefault().InnerText.Trim('\r', '\n', '\t'));

                    Console.WriteLine("Job Summary:" + " " + JobListItem.Descendants("span")
                    .Where(node => node.GetAttributeValue("itemprop", "")
                    .Contains("description")).FirstOrDefault().InnerText.Trim('\r', '\n', '\t'));

                    Console.WriteLine("Job Location:" + " " + JobListItem.Descendants("span")
               .Where(node => node.GetAttributeValue("class", "")
               .Contains("jobLoc")).FirstOrDefault().InnerText.Trim('\r', '\n', '\t'));



                }
            }

            }
        }

1 Ответ

0 голосов
/ 07 ноября 2018

Вы можете сделать это, используя только HtmlAgilityPack. И использует XPath , код становится намного чище и проще.

using System;
using System.Collections.Generic;
using HtmlAgilityPack;

class Program
{
    private static string domainUrl = @"https://www.dice.com";
    private static HtmlWeb web = new HtmlWeb();
    private static List<JobInfo> jobsInfoList = new List<JobInfo>();

    static void Main(string[] args)
    {
        Console.WriteLine("Wait a bit until all pages are downloaded..\n");
        JustDoIt();
        AndPrintResults();

        Console.ReadKey();
    }

    static void JustDoIt()
    {
        var url = domainUrl + @"/jobs?q=information+technology&l=arkansas#dice";
        var htmlDoc = web.Load(url);

        var jobsNodes = htmlDoc.DocumentNode.SelectNodes("//*[@class='complete-serp-result-div']");

        foreach (var jobNode in jobsNodes)
        {
            var jobInfo = new JobInfo
            {
                Title = jobNode.SelectSingleNode(".//span[@itemprop='title']").InnerText,
                CompanyName = jobNode.SelectSingleNode(".//span[@itemprop='name']").InnerText,
                Location = jobNode.SelectSingleNode(".//span[@itemprop='addressLocality']").InnerText,
                Summary = jobNode.SelectSingleNode(".//span[@itemprop='description']").InnerText,
            };

            var hrefToDescriptionPage = jobNode.SelectSingleNode(".//a[contains(@id,'position')]").Attributes["href"].Value;
            var descriptionPage = web.Load(domainUrl + hrefToDescriptionPage);
            jobInfo.Description = descriptionPage.DocumentNode.SelectSingleNode("//*[@id='jobdescSec']").InnerHtml;

            jobsInfoList.Add(jobInfo);
        }
    }

    static void AndPrintResults()
    {
        foreach (var job in jobsInfoList)
        {
            Console.WriteLine($"Title: {job.Title}");
            Console.WriteLine($"CompanyName: {job.CompanyName}");
            Console.WriteLine($"Location: {job.Location}");
            Console.WriteLine($"Summary: {job.Summary}");

            // NOTE!!! I am trimming description up to 1000 symbols here just to keep console clean
            var trimmedDescription = job.Description.Length > 1000 ? job.Description.Substring(0, 1000) : job.Description;
            Console.WriteLine($"Description:\n {trimmedDescription}");
            Console.WriteLine($"==================================================================\n");
        }
    }

    public class JobInfo
    {
        public string CompanyName { get; set; }
        public string Title { get; set; }
        public string Summary { get; set; }
        public string Location { get; set; }

        public string Description { get; set; }
    }
}

И вывод: enter image description here

...