2013-09-01 6 views
0

Im новой для C# и htmlagilitypack и я пытался получить значение signup_form_id которое 2079787163Извлечение значения из HTML с помощью HtmlAgilityPack

<form name="setupform" id="setupform" method="post" action="/signup/" target="_top"> 
<input type="hidden" name="form_type" value="blog" /> 
<input type="hidden" name="stage" value="" /> 
<input type="hidden" name="loc" value="signup" /> 
<input type='hidden' name='signup_form_id' value='2079787163' /><input type="hidden" id="_signup_form" name="_signup_form" value="9783b65654" /> 

Heres мой кодирующая

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
doc.Load("https://signup.wordpress.com/signup/"); 
var value = doc.DocumentNode.SelectSingleNode("//form[@name='signup_form_id'"); 
Console.WriteLine(value.InnerText); 

Я знаю, что-то действительно не так с моим выражением xpath, и я действительно не знаю об этом. Может ли какая-нибудь душа дать какие-то предложения? Большое спасибо!

ответ

1

Прежде всего, ваш код выходит из строя на линии doc.Load, потому что этот метод «Загрузить» не поддерживает URI, а только путь к файлу. Вы должны использовать метод HtmlWebLoad для загрузки HTML.

Во-вторых, недостатки в вашем XPath:

  • Вы забыли закрывающую скобку ]
  • нет никакой формы с именем, установленным в signup_form_id

В заключение, вы должны изменить ваш код следующим образом:

var url = "http://signup.wordpress.com/signup/"; 

var htmlWeb = new HtmlWeb(); 
var doc = htmlWeb.Load(url); 

var value = doc.DocumentNode.SelectSingleNode("//form[@id='setupform']"); 
Console.WriteLine(value.OuterHtml); 

Обновление: Хорошо, что вы уточнили вопрос; Сначала я неправильно понял проблему.

Похоже, что вы ищете тег input, а не form. Итак, ваш XPath должен быть изменен, чтобы соответствовать этому требованию.

Вот код, который считывает часть данных вам необходимо:

var url = "http://signup.wordpress.com/signup/"; 

var htmlWeb = new HtmlWeb(); 
var doc = htmlWeb.Load(url); 

var signupFormIdElement = doc.DocumentNode 
    .SelectSingleNode("//input[@name='signup_form_id']"); 

var signupFormId = signupFormIdElement.GetAttributeValue("value", ""); 

Console.WriteLine(signupFormId); 
+0

Я думаю, что выражение XPath вы после будет что-то вроде '// ввод [@ имя =«signup_form_id»]/@ value' или, возможно, более строгая '// form [@ id = 'setupform']/input [@ name = 'signup_form_id']/@ value'. – rmhartog

+0

благодарит w0lf и @rmhartog за отзывы ур. Да, я пытаюсь получить только значение 2079787163. Использование // input [@ name = 'signup_form_id']/@ меня получает до "". Есть идеи? – Gene

+0

Вы использовали этот xpath в комбинации с InnerHTML вместо OuterHTML? Я не пытаюсь это сделать, но HTH. – rmhartog

Смежные вопросы