Синтаксический анализ HTML — Как получить число из тега?

#c# #browser #html-parsing

#c# #браузер #html-синтаксический анализ

Вопрос:

Я разрабатываю приложение Windows Forms, которое взаимодействует с веб-сайтом.

Используя WebBrowser элемент управления, я управляю веб-сайтом и могу выполнять итерации по тегам с помощью:

 HtmlDocument webDoc1 = this.webBrowser1.Document;
HtmlElementCollection aTags = webDoc1.GetElementsByTagName("a");
  

Теперь я хочу получить определенный текст из тега, который находится ниже:

<a href="issue?status=-1,1,2,3,4,5,6,7amp;amp;@sort=-activityamp;amp;@search_text=amp;amp;@dispname=Show Assignedamp;amp;@filter=status,assignedtoamp;amp;@group=priorityamp;amp;@columns=id,activity,title,creator,statusamp;amp;assignedto=244amp;amp;@pagesize=50amp;amp;@startwith=0">Show Assigned</a><br>

Как и здесь, я хочу получить число 244, которое равно assignedto в приведенном выше теге, и сохранить его в переменной для дальнейшего использования.

Как я могу это сделать?

Ответ №1:

Вы можете попробовать разделить строку на значения ‘;’, а затем каждую строку на ‘=’ следующим образом:

 string aTag = ...;
foreach(var splitted in aTag.Split(';'))
{
   if(splitted.Contains("="))
   {
      var leftSide = splitted.Split('=')[0];
      var rightSide = splitted.Split('=')[1];
      if(leftSide == "assignedto")
      {
          MessageBox.Show(rightSide); //It should be 244
          //Or...
          int num = int.Parse(rightSide);
      }
   }
}
  

Другой вариант — использовать регулярные выражения, которые вы можете протестировать здесь: www.regextester.com. И еще немного информации о регулярных выражениях: http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.aspx

Надеюсь, это поможет!

Комментарии:

1. но как получить тег coumplete в виде строки

2. попробуйте foreach(HTMLElement HTMLElement в aTags){ string aTag = HTMLElement. outerHTML;}

Ответ №2:

Если все случаи похожи на этот и вы не возражаете против ссылки на System.Web в вашем приложении Windows Forms, вы можете сделать что-то вроде этого:

 using System;

public class Program
{
    static void Main()
    {
        string href = @"issue?status=-1,1,2,3,4,5,6,7amp;amp;
@sort=-activityamp;amp;@search_text=amp;amp;@dispname=Show Assignedamp;amp;
@filter=status,assignedtoamp;amp;@group=priorityamp;amp;
@columns=id,activity,title,creator,statusamp;amp;assignedto=244amp;amp;
@pagesize=50amp;amp;@startwith=0";

        href = System.Web.HttpUtility.HtmlDecode(href);

        var querystring = System.Web.HttpUtility.ParseQueryString(href);

        Console.WriteLine(querystring["assignedto"]);
    }
}
  

Это упрощенный пример, и сначала вам нужно извлечь href текст атрибута, но это не должно быть сложным. Имея href текст атрибута, вы можете воспользоваться преимуществами, которые в основном представляют собой строку запроса, и повторно использовать код в .NET, который уже анализирует строки запроса.

Для завершения примера, чтобы получить href текст атрибута, вы могли бы сделать:

 HtmlElementCollection aTags = webBrowser.Document.GetElementsByTagName("a");

foreach (HtmlElement element in aTags)
{
    string href = element.GetAttribute("href");
}
  

Комментарии:

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

2. Если вы не добавите кучу предположений, я бы не стал делать это каким-либо другим способом, и могу я спросить, почему вы находите это сложным?

3. <a> В документе, вероятно, имеет href значение, не соответствующее формату, который вы привели в качестве примера.