Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2016, 15:46   #1
fanat_96
Пользователь
 
Регистрация: 09.04.2016
Сообщений: 81
По умолчанию xpath-запрос перестал работать

Здравствуйте. До этого момента все было хорошо, но внезапно перестал срабатывать один из xpath-запросов на получение ссылки к изображению на странице с книгой.

сайт litres.ru

Код:
 using (HttpClientHandler handler = new HttpClientHandler() { AllowAutoRedirect = true, AutomaticDecompression = System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.Deflate })
{
using (HttpClient client = new HttpClient(handler) { BaseAddress = new Uri(url) })
 {
HD.LoadHtml(client.GetStringAsync(urlTwo).Result);
Download_Image();
//ищем заголовок книги
var title = HD.DocumentNode.SelectSingleNode("//h1");
 textBox2.Text = title.InnerText;                     
}
}
Мне выдает ошибку в функции Download_Image

Код:
public void Download_Image()
        {
            //Получаем постер и сохраняем его
            WebClient wc = new WebClient();
            string path= HD.DocumentNode.SelectSingleNode("//img[@id='biblio_book_cover_image']").GetAttributeValue("src", "");
            wc.DownloadFileAsync(new Uri("https:" + path), disk.Text + System.IO.Path.GetFileName("poster.jpg"));
        }
Ошибка: Ссылка на объект не указывает на экземпляр объекта.
Проверял этот запрос отдельно, не через студию, и все работает нормально. А в самой программе хоть убей, но не хочет. Никаких изменений в код не вносил, он просто внезапно перестал срабатывать.
fanat_96 вне форума Ответить с цитированием
Старый 21.09.2016, 15:56   #2
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

так а где ошибка? она вообще связана с вашим xpath
а если да то смотрите структуру дома
вощем у вас вопрос тупо на позырить и понять
come-on вне форума Ответить с цитированием
Старый 21.09.2016, 15:57   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ctrl+U, Ctrl+F, нету там никакого элемента с ID biblio_book_cover_image.

Судя по GetStringAsync().Result и использованию в одной функции HttpClient, а в другой WebClient вы копипастите магические куски кода без полного понимания того, что вы делаете. Так вы далеко не уедете.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 21.09.2016, 16:51   #4
fanat_96
Пользователь
 
Регистрация: 09.04.2016
Сообщений: 81
По умолчанию

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

Код:
string poster = new Regex(@"document.write\(.+?data-original-image-url='(.+?)'.+?\);", RegexOptions.IgnoreCase | RegexOptions.Singleline).Match(client.GetStringAsync(urlTwo).Result).Groups[1].Value;
Если есть более оптимальный вариант - хотелось бы услышать.

И по поводу использования WebClient: я не нашел другого способа сохранения изображений, поэтому использую его для этого. И опять же, если вы их знаете, то поделитесь, буду премного благодарен)
fanat_96 вне форума Ответить с цитированием
Старый 21.09.2016, 17:00   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Дык речь не о использовании WebClient, а о том, что в одном месте он, в другом HttpClient, еще в третьем наверняка HttpWebRequest.
+ там вызов DownloadFileAsync, но нет обработки ошибок (исключений) и никто никогда о них не узнает.
+ другой экземпляр клиента на второй запрос. В данном случае может быть не важно, но часто надо хранить и использовать куки между запросами.
+ наверняка можно было обойтись без глобальной переменной HD

И HttpClient предназначен для асинхронного использования (async/await), если нужны просто синхронные запросы, то проще взять WebClient.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 21.09.2016, 17:07   #6
fanat_96
Пользователь
 
Регистрация: 09.04.2016
Сообщений: 81
По умолчанию

На самом деле, даже не задумывался об использовании WebClient для получения содержимого страницы, как-то привык к HttpClient и все. Спасибо, буду теперь гуглить в таком в таком случае)
fanat_96 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перестал работать Intellisense ninja2 Visual C++ 25 20.10.2015 16:34
Перестал работать css impulsgraw HTML и CSS 8 22.08.2011 21:28
Перестал работать тестер kanich Помощь студентам 4 15.11.2010 13:02
Перестал работать инетрнет Golovastik Операционные системы общие вопросы 8 16.01.2010 14:12