• XSS.stack #1 – первый литературный журнал от юзеров форума

Помогите спарсить названия

Ags1of

RAM
Пользователь
Регистрация
26.11.2021
Сообщения
122
Реакции
1
Нужно, чтобы парсились все каналы, который выдаст ютуб по моему запросу
вот код:

C#:
using Fizzler.Systems.HtmlAgilityPack;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Windows.Forms;



namespace Boil
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void label1_Click(object sender, EventArgs e)
        {
            
        }

        public void textBox1_TextChanged(object sender, EventArgs e)
        {
            
        }

        public  void button1_Click(object sender, EventArgs e)
        {
            Start();
        }
        public void richTextBox1_TextChanged(object sender, EventArgs e)
        {

        }






        public void Start()
        {
            WebClient web = new WebClient();
            string txt = textBox1.Text;
            string[] hui = SortTextForReq(txt);
            string LoadString = "https://www.youtube.com/results?search_query=";
            for (int i = 0; i < hui.Length; i++)
            {
                LoadString += hui[i] + "+";
            }
            richTextBox1.AppendText(LoadString + " ");
            string resp = web.DownloadString(LoadString);
            File.WriteAllText("Query.html", resp, Encoding.UTF8);
            Process.Start("Query.html");



            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(resp);

            string pars = doc.DocumentNode.QuerySelector("ytd-app").InnerHtml;

            foreach (var item in doc.DocumentNode.QuerySelectorAll("a#yt-simple-endpoint style-scope yt-formatted-string.spellcheck.href")) //в этой строке пытаюсь найти каналы, но не работает
            {
                richTextBox1.AppendText(item.InnerText + " ");
            }
            

        }
        public static string[] SortTextForReq(string text)
        {
            string[] words = text.Split(' ');
            
            int counter = 0;

            //for (int i = 0; i < words.Length; i++)
            //{
            //    if (words[i] != null || words[i] != "")
            //    {
            //        counter++;   
            //    }
            //}

            //string[] sortWords = new string[counter];
            //int iter = 0;

            //for (int i = 0; i < words.Length; i++)
            //{
            //    if (words[i] != "")
            //    {
            //        sortWords[iter] = words[i];
            //        iter++;
            //    }
            //    else
            //    {
            //        continue;
            //    }
            //}
            return words;
        }

      
    }
}
 
Если подкинуть валидных куки и валидный x-client-data, то тащит лучше.
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.IO;
using System.Threading;

namespace you
{
    internal class Program
    {
        public static string query = "";
        public static List<string> youtubeChannels = new List<string>();
        public static void parsingFunc()
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create($"https://www.youtube.com/results?search_query={query}");
            request.Headers.Add("authority", "www.youtube.com");
            request.Headers.Add("accept-language", "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7");
            request.Headers.Add("cache-control", "max-age=0");
            //request.Headers.Add("cookie", "VISITOR_INFO1_LIVE=eU1nlvWmI8o; SID=JwjjxumVmU87Re1obyl-R0nhckzk5jDYi_HUSEpYi21aDA33BVgQ6T48LVSSVjbAn7GPdQ.; __Secure-1PSID=JwjjxuwerU87Re1obyl-R0nhckzk5jDYi_HUSEpYi21aDALV_X0HPT_8WJV-cwnKohNNXQ.; __Secure-3PSID=JwjjxumVmU87Re1obyl-R0nhckzk5jDYi_HUSEpYi21aDALVb1vt7CMtlutaktLURRvtQg.; HSID=AOquxr502JHEQEjQv; SSID=AxupHQAUlHLGIAdss; APISID=9n-UqAUJbpGOxEUe/Af4BlStiEZtc1JU1N; SAPISID=ML-ZV6VcptxNFo1D/AICPCCMALrLn6R05Q; __Secure-1PAPISID=ML-ZV6VcptxNFo1D/AICPZZMALrLn6R05Q; __Secure-3PAPISID=ML-ZV6Vcptxwwo1D/AICPCCMAwwLn6R05Q; LOGIN_INFO=AFmmF2swwAIgwwUyhnOuIMtDzs0wC-CfJGeTM7EYrM4LnzkfP8T1m3ACIAXNFyEIgvL0dF6uwkOZkOUQkGgS4uDv49UdYZumS1hC:QUQ3MjNmeVNqNTA1M3BNTlNBSXgyNzNFVjN2cXJZeHcyREhQLTFxMXBxY3J0NGdqTXJjUEV4TWEyaUhOUFRFUjhVYUJBWGJ1eXZlZHFONDhCNTg1Uk9xMFVfUDF2ZmdMbURISDdZWE9pOUZvQ0QtTC1ZdUxIM21Ma1ZnWkpfczVpS0RqdkZULThwU2hmZXJHaEtHN3JNQnNsR1JDeFN3XzV3; PREF=tz=Europe.Moscow&f6=40000400&f5=30000; YSC=SWroCbIFEjg; SIDCC=AJi4QfEQF83JUpZEt6fRC6p1QtUTkJIkBJ9ATCiKre9UXq0833xkTEWvzhNY5xHoApyspa0AVb4; __Secure-3PSIDCC=AJi4QfGIcjBnvHcc_3SDSK2yOlgGbLf6XEb69MMkpk03gShY6bBSXT2OJoD2k6Vq2_9OOZT-O7E");
            request.Headers.Add("dnt", "1");
            request.Headers.Add("sec-ch-ua", "^^");
            request.Headers.Add("sec-ch-ua-arch", "^^");
            request.Headers.Add("sec-ch-ua-bitness", "^^");
            request.Headers.Add("sec-ch-ua-full-version", "^^");
            request.Headers.Add("sec-ch-ua-full-version-list", "^^");
            request.Headers.Add("sec-ch-ua-mobile", "?0");
            request.Headers.Add("sec-ch-ua-model", "^^");
            request.Headers.Add("sec-ch-ua-platform", "^^");
            request.Headers.Add("sec-ch-ua-platform-version", "^^");
            request.Headers.Add("sec-fetch-dest", "document");
            request.Headers.Add("sec-fetch-mode", "navigate");
            request.Headers.Add("sec-fetch-site", "same-origin");
            request.Headers.Add("sec-fetch-user", "?1");
            request.Headers.Add("sec-gpc", "1");
            request.Headers.Add("service-worker-navigation-preload", "true");
            request.Headers.Add("upgrade-insecure-requests", "1");
            request.Headers.Add("x-client-data", "dddddEIj7bJAQiktskBCMG2yQEIqZ3KAQjO28oBCJKhywEI2+/LAQjnhMwBCJqazAEIiavMAQikr8wBCLGyzAEYq6nKAQ==");
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream stream = response.GetResponseStream();
            StreamReader reader = new StreamReader(stream);
            var pageSource = reader.ReadToEnd().Split('\"');
            for (int i = 0; i < pageSource.Count(); i++)
            {
                if (pageSource[i].Contains("url") && pageSource[i + 2].Contains("/c/"))
                {
                    if (!youtubeChannels.Contains("https://www.youtube.com" + pageSource[i + 2]))
                    {
                        Console.WriteLine("https://www.youtube.com" + pageSource[i + 2]);
                        youtubeChannels.Add("https://www.youtube.com" + pageSource[i + 2]);
                    }

                }
            }
        }
        static void Main(string[] args)
        {
            // https://www.youtube.com/results?search_query=
            Console.WriteLine("Take me your query here");
            query = Console.ReadLine();
            Thread thread = new Thread(parsingFunc);
            thread.Start();
            Console.ReadLine();
        }
    }
}
 
Если подкинуть валидных куки и валидный x-client-data, то тащит лучше.
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.IO;
using System.Threading;

namespace you
{
    internal class Program
    {
        public static string query = "";
        public static List<string> youtubeChannels = new List<string>();
        public static void parsingFunc()
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create($"https://www.youtube.com/results?search_query={query}");
            request.Headers.Add("authority", "www.youtube.com");
            request.Headers.Add("accept-language", "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7");
            request.Headers.Add("cache-control", "max-age=0");
            //request.Headers.Add("cookie", "VISITOR_INFO1_LIVE=eU1nlvWmI8o; SID=JwjjxumVmU87Re1obyl-R0nhckzk5jDYi_HUSEpYi21aDA33BVgQ6T48LVSSVjbAn7GPdQ.; __Secure-1PSID=JwjjxuwerU87Re1obyl-R0nhckzk5jDYi_HUSEpYi21aDALV_X0HPT_8WJV-cwnKohNNXQ.; __Secure-3PSID=JwjjxumVmU87Re1obyl-R0nhckzk5jDYi_HUSEpYi21aDALVb1vt7CMtlutaktLURRvtQg.; HSID=AOquxr502JHEQEjQv; SSID=AxupHQAUlHLGIAdss; APISID=9n-UqAUJbpGOxEUe/Af4BlStiEZtc1JU1N; SAPISID=ML-ZV6VcptxNFo1D/AICPCCMALrLn6R05Q; __Secure-1PAPISID=ML-ZV6VcptxNFo1D/AICPZZMALrLn6R05Q; __Secure-3PAPISID=ML-ZV6Vcptxwwo1D/AICPCCMAwwLn6R05Q; LOGIN_INFO=AFmmF2swwAIgwwUyhnOuIMtDzs0wC-CfJGeTM7EYrM4LnzkfP8T1m3ACIAXNFyEIgvL0dF6uwkOZkOUQkGgS4uDv49UdYZumS1hC:QUQ3MjNmeVNqNTA1M3BNTlNBSXgyNzNFVjN2cXJZeHcyREhQLTFxMXBxY3J0NGdqTXJjUEV4TWEyaUhOUFRFUjhVYUJBWGJ1eXZlZHFONDhCNTg1Uk9xMFVfUDF2ZmdMbURISDdZWE9pOUZvQ0QtTC1ZdUxIM21Ma1ZnWkpfczVpS0RqdkZULThwU2hmZXJHaEtHN3JNQnNsR1JDeFN3XzV3; PREF=tz=Europe.Moscow&f6=40000400&f5=30000; YSC=SWroCbIFEjg; SIDCC=AJi4QfEQF83JUpZEt6fRC6p1QtUTkJIkBJ9ATCiKre9UXq0833xkTEWvzhNY5xHoApyspa0AVb4; __Secure-3PSIDCC=AJi4QfGIcjBnvHcc_3SDSK2yOlgGbLf6XEb69MMkpk03gShY6bBSXT2OJoD2k6Vq2_9OOZT-O7E");
            request.Headers.Add("dnt", "1");
            request.Headers.Add("sec-ch-ua", "^^");
            request.Headers.Add("sec-ch-ua-arch", "^^");
            request.Headers.Add("sec-ch-ua-bitness", "^^");
            request.Headers.Add("sec-ch-ua-full-version", "^^");
            request.Headers.Add("sec-ch-ua-full-version-list", "^^");
            request.Headers.Add("sec-ch-ua-mobile", "?0");
            request.Headers.Add("sec-ch-ua-model", "^^");
            request.Headers.Add("sec-ch-ua-platform", "^^");
            request.Headers.Add("sec-ch-ua-platform-version", "^^");
            request.Headers.Add("sec-fetch-dest", "document");
            request.Headers.Add("sec-fetch-mode", "navigate");
            request.Headers.Add("sec-fetch-site", "same-origin");
            request.Headers.Add("sec-fetch-user", "?1");
            request.Headers.Add("sec-gpc", "1");
            request.Headers.Add("service-worker-navigation-preload", "true");
            request.Headers.Add("upgrade-insecure-requests", "1");
            request.Headers.Add("x-client-data", "dddddEIj7bJAQiktskBCMG2yQEIqZ3KAQjO28oBCJKhywEI2+/LAQjnhMwBCJqazAEIiavMAQikr8wBCLGyzAEYq6nKAQ==");
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream stream = response.GetResponseStream();
            StreamReader reader = new StreamReader(stream);
            var pageSource = reader.ReadToEnd().Split('\"');
            for (int i = 0; i < pageSource.Count(); i++)
            {
                if (pageSource[i].Contains("url") && pageSource[i + 2].Contains("/c/"))
                {
                    if (!youtubeChannels.Contains("https://www.youtube.com" + pageSource[i + 2]))
                    {
                        Console.WriteLine("https://www.youtube.com" + pageSource[i + 2]);
                        youtubeChannels.Add("https://www.youtube.com" + pageSource[i + 2]);
                    }

                }
            }
        }
        static void Main(string[] args)
        {
            // https://www.youtube.com/results?search_query=
            Console.WriteLine("Take me your query here");
            query = Console.ReadLine();
            Thread thread = new Thread(parsingFunc);
            thread.Start();
            Console.ReadLine();
        }
    }
}
а как-нибудь используя мой код, который я скинул, можно реализовать? Не хочу вставлять куки и тд.
 
Так если без кук не тащит, а с куками тащит - ну так ставь куки и тащи. В чем тогда вопрос?)
Почему не хочешь? Чем тебе куки мешают?
Что у тебя вообще отдается то в итоге? Если там гугл отдает страницу с просьбой включить куки, то надо включить.
 
Так если без кук не тащит, а с куками тащит - ну так ставь куки и тащи. В чем тогда вопрос?)
Почему не хочешь? Чем тебе куки мешают?
Что у тебя вообще отдается то в итоге? Если там гугл отдает страницу с просьбой включить куки, то надо включить.
не тащится, потому что я не могу понять, как правильно указать путь, чтобы мне спарсить все каналы, а вот то, что мне скинули сверху, я не особо понимаю, поэтому и не хочу браться
 
Так если без кук не тащит, а с куками тащит - ну так ставь куки и тащи. В чем тогда вопрос?)
Почему не хочешь? Чем тебе куки мешают?
Что у тебя вообще отдается то в итоге? Если там гугл отдает страницу с просьбой включить куки, то надо включить.
Я имел ввиду, что с куками выхлоп больше. Я не знаю почему так, но с куками вместо условных 8ми каналов отдает 16.
А в итоге список youtubeChannels с каналами и без дублей

p.s куки нужны от аккаунта, а не простые
 
Я имел ввиду, что с куками выхлоп больше. Я не знаю почему так, но с куками вместо условных 8ми каналов отдает 16.
А в итоге список youtubeChannels с каналами и без дублей
я бы хотел, чтобы было так, но я не хочу тупо копипастить код и вставлять в прогу, не понимая, что делает код
 
Как вариант, ты вообще можешь использовать api Ютуба. Не знаю, какие там у него ограничения, потести, хватит для твоих целей или нет.

В переменную resp у тебя что в итоге Гугл отдает? Мне лень Визуал студию сейчас запускать) Просто проблема в чем конкретно? Гугл не отдает страницу с каналами? Или ты просто не можешь ее распарсить?
Его код делает тоже самое примерно, что и твой, просто к запросу добавлены заголовки.
 
Как вариант, ты вообще можешь использовать api Ютуба. Не знаю, какие там у него ограничения, потести, хватит для твоих целей или нет.

В переменную resp у тебя что в итоге Гугл отдает? Мне лень Визуал студию сейчас запускать) Просто проблема в чем конкретно? Гугл не отдает страницу с каналами? Или ты просто не можешь ее распарсить?
мы сможем созвониться в дискорде?
 
Как вариант, ты вообще можешь использовать api Ютуба. Не знаю, какие там у него ограничения, потести, хватит для твоих целей или нет.

В переменную resp у тебя что в итоге Гугл отдает? Мне лень Визуал студию сейчас запускать) Просто проблема в чем конкретно? Гугл не отдает страницу с каналами? Или ты просто не можешь ее распарсить?
Его код делает тоже самое примерно, что и твой, просто к запросу добавлены заголовки.
по запросам у меня всё нормально, я ввожу слово, по нему выводятся видео, но я не могу распарсить эту страницу так, чтобы получить только названия ютуб каналов
 
Нет, не можем.

Поставь точку останова, запусти в режиме отладки и посмотри, что у тебя в ответе от Гугла приходит. Если там нормальная страница с каналами, которые нужны, то у тебя проблемы тупо с парсингом результата. Если там какой-то кривой ответ, то проблема с запросом.
 
Проверяй
C#:
using Fizzler.Systems.HtmlAgilityPack;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Windows.Forms;



namespace Boil
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void label1_Click(object sender, EventArgs e)
        {
          
        }

        public void textBox1_TextChanged(object sender, EventArgs e)
        {
          
        }

        public  void button1_Click(object sender, EventArgs e)
        {
            Start();
        }
        public void richTextBox1_TextChanged(object sender, EventArgs e)
        {

        }






        public void Start()
        {
            string query = textBox1.Text;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create($"https://www.youtube.com/results?search_query={query}");
            request.Headers.Add("authority", "www.youtube.com");
            request.Headers.Add("accept-language", "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7");
            request.Headers.Add("cache-control", "max-age=0");
            //request.Headers.Add("cookie", "VISITOR_INFO1_LIVE=eU1nlvWmI8o; SID=JwjjxumVmU87Re1obyl-R0nhckzk5jDYi_HUSEpYi21aDA33BVgQ6T48LVSSVjbAn7GPdQ.; __Secure-1PSID=JwjjxuwerU87Re1obyl-R0nhckzk5jDYi_HUSEpYi21aDALV_X0HPT_8WJV-cwnKohNNXQ.; __Secure-3PSID=JwjjxumVmU87Re1obyl-R0nhckzk5jDYi_HUSEpYi21aDALVb1vt7CMtlutaktLURRvtQg.; HSID=AOquxr502JHEQEjQv; SSID=AxupHQAUlHLGIAdss; APISID=9n-UqAUJbpGOxEUe/Af4BlStiEZtc1JU1N; SAPISID=ML-ZV6VcptxNFo1D/AICPCCMALrLn6R05Q; __Secure-1PAPISID=ML-ZV6VcptxNFo1D/AICPZZMALrLn6R05Q; __Secure-3PAPISID=ML-ZV6Vcptxwwo1D/AICPCCMAwwLn6R05Q; LOGIN_INFO=AFmmF2swwAIgwwUyhnOuIMtDzs0wC-CfJGeTM7EYrM4LnzkfP8T1m3ACIAXNFyEIgvL0dF6uwkOZkOUQkGgS4uDv49UdYZumS1hC:QUQ3MjNmeVNqNTA1M3BNTlNBSXgyNzNFVjN2cXJZeHcyREhQLTFxMXBxY3J0NGdqTXJjUEV4TWEyaUhOUFRFUjhVYUJBWGJ1eXZlZHFONDhCNTg1Uk9xMFVfUDF2ZmdMbURISDdZWE9pOUZvQ0QtTC1ZdUxIM21Ma1ZnWkpfczVpS0RqdkZULThwU2hmZXJHaEtHN3JNQnNsR1JDeFN3XzV3; PREF=tz=Europe.Moscow&f6=40000400&f5=30000; YSC=SWroCbIFEjg; SIDCC=AJi4QfEQF83JUpZEt6fRC6p1QtUTkJIkBJ9ATCiKre9UXq0833xkTEWvzhNY5xHoApyspa0AVb4; __Secure-3PSIDCC=AJi4QfGIcjBnvHcc_3SDSK2yOlgGbLf6XEb69MMkpk03gShY6bBSXT2OJoD2k6Vq2_9OOZT-O7E");
            request.Headers.Add("dnt", "1");
            request.Headers.Add("sec-ch-ua", "^^");
            request.Headers.Add("sec-ch-ua-arch", "^^");
            request.Headers.Add("sec-ch-ua-bitness", "^^");
            request.Headers.Add("sec-ch-ua-full-version", "^^");
            request.Headers.Add("sec-ch-ua-full-version-list", "^^");
            request.Headers.Add("sec-ch-ua-mobile", "?0");
            request.Headers.Add("sec-ch-ua-model", "^^");
            request.Headers.Add("sec-ch-ua-platform", "^^");
            request.Headers.Add("sec-ch-ua-platform-version", "^^");
            request.Headers.Add("sec-fetch-dest", "document");
            request.Headers.Add("sec-fetch-mode", "navigate");
            request.Headers.Add("sec-fetch-site", "same-origin");
            request.Headers.Add("sec-fetch-user", "?1");
            request.Headers.Add("sec-gpc", "1");
            request.Headers.Add("service-worker-navigation-preload", "true");
            request.Headers.Add("upgrade-insecure-requests", "1");
            request.Headers.Add("x-client-data", "dddddEIj7bJAQiktskBCMG2yQEIqZ3KAQjO28oBCJKhywEI2+/LAQjnhMwBCJqazAEIiavMAQikr8wBCLGyzAEYq6nKAQ==");
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream stream = response.GetResponseStream();
            StreamReader reader = new StreamReader(stream);
            var pageSource = reader.ReadToEnd().Split('\"');
            for (int i = 0; i < pageSource.Count(); i++)
            {
                if (pageSource[i].Contains("url") && pageSource[i + 2].Contains("/c/"))
                {
                    if (!youtubeChannels.Contains("https://www.youtube.com" + pageSource[i + 2]))
                    {
                        youtubeChannels.Add("https://www.youtube.com" + pageSource[i + 2]);
                        richTextBox1.AppendText("https://www.youtube.com" + pageSource[i + 2]);
                    }

                }
            }
        
        }
        public static string[] SortTextForReq(string text)
        {
            string[] words = text.Split(' ');
          
            int counter = 0;

            //for (int i = 0; i < words.Length; i++)
            //{
            //    if (words[i] != null || words[i] != "")
            //    {
            //        counter++; 
            //    }
            //}

            //string[] sortWords = new string[counter];
            //int iter = 0;

            //for (int i = 0; i < words.Length; i++)
            //{
            //    if (words[i] != "")
            //    {
            //        sortWords[iter] = words[i];
            //        iter++;
            //    }
            //    else
            //    {
            //        continue;
            //    }
            //}
            return words;
        }

    
    }
}
 
Последнее редактирование:
по запросам у меня всё нормально, я ввожу слово, по нему выводятся видео, но я не могу распарсить эту страницу так, чтобы получить только названия ютуб каналов
А, так у тебя селектор кривой. QuerySelectorAll принимает же обычный css селектор?
Тогда там должно быть что-то типа этого: a.yt-simple-endpoint.style-scope.yt-formatted-string

А # - это селектор id, а не class. href и spellcheck это атрибуты, а ты их как класс в селектор добавил. Если хочешь оставить, то они в квадратных скобках указываются. Что-то тогда типа такого будет:
a.yt-simple-endpoint.style-scope.yt-formatted-string[spellcheck=yes]

string pars = doc.DocumentNode.QuerySelector("ytd-app").InnerHtml;
И тут если ytd-app это класс, то перед ним точку добавь. QuerySelector(".ytd-app")

А вообще проще бы регуляркой спарсил, чем лишнюю либу ставить.
 
Последнее редактирование:
xpath

C#:
var elements = doc.DocumentNode.SelectNodes("//div[@id='channel-info']/ytd-channel-name/div/div/yt-formatted-string/a");

foreach(var node in elements)
{
    Console.WriteLine(node.InnerText + ":" + node.Attributes["href"].Value);
}
 
А, так у тебя селектор кривой. QuerySelectorAll принимает же обычный css селектор?
Тогда там должно быть что-то типа этого: a.yt-simple-endpoint.style-scope.yt-formatted-string

А # - это селектор id, а не class. href и spellcheck это атрибуты, а ты их как класс в селектор добавил. Если хочешь оставить, то они в квадратных скобках указываются. Что-то тогда типа такого будет:
a.yt-simple-endpoint.style-scope.yt-formatted-string[spellcheck=yes]


И тут если ytd-app это класс, то перед ним точку добавь. QuerySelector(".ytd-app")

А вообще проще бы регуляркой спарсил, чем лишнюю либу ставить.
Так-то по идее парсером хтмля правильнее чем регулярками этот самый хтмл разбирать, но если тс делает какой-то бот для ютуба который будет что-то там мутить и работать тихо и удалённо то наверное соглашусь
 
ТС судя по всему только учится. Вряд ли он мутит тихого бота с формами) И вот с точки зрения обучения, правильно не пихать либу на каждый пук, а учиться делать сначала нативными средствами. Чтобы потом реально понимать, когда нужна либа, а когда не нужна. Заодно и повод изучить регулярки, которые нужны каждому программисту.

Но ладно бы он не знал регулярки, но знал css. Так он и css не знает. Так что в его конкретном случае я голосую за регулярки)
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх