Извлечение данных из HTML-формы с помощью пакета гибкости HTML

c# html html-agility-pack winforms

Вопрос

Я пытаюсь перечислить все узлы в HTML-форме, я динамически использую пакет гибкости HTML, что означает, что я не знаю имен Атрибутов и имен ввода. Проблема в том, когда я хочу получить метку, соответствующую вводу.

<form name="input" action="html_form_action.asp" method="get">
Username: <input type="text" name="user" />
<input type="submit" value="Submit" />
</form>

Поэтому здесь я хочу написать Username, а затем вход, в этом примере он кажется действительно очевидным, но иногда они не являются непосредственными братьями и сестрами, было бы много скрытых входов или других тегов.

Другой пример:

   <input type=hidden name="startDate">

      <TR>  <TD bgColor=#008088 colSpan=2 class="headfont">

        <FONT color=#FFFFFF>  <B>* Enter ur username and password</B> </FONT>

      </TD></TR>

      <TR>

       <TD bgColor=#9ccdcd class="datafont"><FONT color=black>Username</FONT></TD>

            <TD bgColor=#9ccdcd class="datafont">

            <INPUT tabIndex=1 name=stuNum 

              autocomplete="off" size="20"></TD></TR>

          <TR>

Я использую winforms C # в своем проекте.

У меня мало идей, но они будут занимать много времени, поэтому я подумал, что, поскольку я новичок в пакете гибкости HTML, будет какой-то способ или какой-то ярлык, чтобы получить его ., Любые предложения?

Популярные ответы

Что-то вроде этого должно работать.

static IEnumerable<Tuple<string, HtmlNode>> GetInputNodes(HtmlDocument doc, params string[] fields)
{
    var form = doc.DocumentNode.SelectSingleNode("//form");
    foreach (var field in fields)
    {
        var fieldNode = form.ChildNodes
            .OfType<HtmlTextNode>()
            .Where(node => node.Text.Trim().StartsWith(field, StringComparison.OrdinalIgnoreCase))
            .SingleOrDefault();
        if (fieldNode == null)
            continue;

        var input = FindCorrespondingInputNode(fieldNode);
        if (input != null)
            yield return Tuple.Create(field, input);
    }
}

static HtmlNode FindCorrespondingInputNode(HtmlTextNode fieldNode)
{
    for (var currentNode = fieldNode.NextSibling;
         currentNode != null && currentNode.NodeType != HtmlNodeType.Text;
         currentNode = currentNode.NextSibling)
    {
        if (currentNode.Name == "input"
         && !currentNode.Attributes["type"].Value.Contains("hidden"))
        {
            return currentNode;
        }
    }
    return null;
}

Затем, чтобы использовать его, просто введите имена полей, для которых вы хотите получить элементы ввода.

GetInputNodes(doc, "username");

Просто предупреждение, похоже, что HtmlAgilityPack не закрывает форму, как это должно быть. Поэтому вам нужно будет указать, что элементы формы должны быть закрыты перед загрузкой html. Без него HAP не признает, что форма имеет дочерние узлы.

var doc = new HtmlDocument();
HtmlNode.ElementsFlags["form"] = HtmlElementFlag.Closed;
doc.Load(url);


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему