Попытка разобрать HTML-документ и извлечь некоторые элементы (любые ссылки на текстовые файлы).
Текущая стратегия заключается в загрузке HTML-документа в строку. Затем найдите все экземпляры ссылок на текстовые файлы. Это может быть файл любого типа, но для этого вопроса это текстовый файл.
Конечная цель - создать список IEnumerable
строковых объектов. Эта часть проста, но анализ данных - вопрос.
<html>
<head><title>Blah</title>
</head>
<body>
<br/>
<div>Here is your first text file: <a href="http://myServer.com/blah.txt"></div>
<span>Here is your second text file: <a href="http://myServer.com/blarg2.txt"></span>
<div>Here is your third text file: <a href="http://myServer.com/bat.txt"></div>
<div>Here is your fourth text file: <a href="http://myServer.com/somefile.txt"></div>
<div>Thanks for visiting!</div>
</body>
</html>
Исходные подходы:
- загрузить строку в документ XML и атаковать ее способом Linq-To-Xml.
- создать регулярное выражение для поиска строки, начинающейся с
href=
и заканчивающейся .txt
Вопрос:
- как бы выглядело это регулярное выражение? Я новичок в области регулярных выражений, и это часть моего обучения регулярным выражениям.
- какой метод вы бы использовали для извлечения списка тегов?
- Какой будет самый эффективный способ?
- какой метод будет наиболее читабельным / поддерживаемым?
Обновление:
Престижность
Мэтью в предложении HTML Agility Pack. Работало просто отлично! Предложение XPath также работает. Хотелось бы пометить оба ответа как «Ответ», но я, очевидно, не могу. Оба они являются правильными решениями проблемы.
Вот консольное приложение C #, использующее регулярное выражение, предложенное Jeff . Он отлично читает строку и не будет содержать href, который не заканчивается на .txt. В данном примере он корректно НЕ включает файл .txt.snarg
в результаты (как указано в строковой функции HTML).
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
namespace ParsePageLinks
{
class Program
{
static void Main(string[] args)
{
GetAllLinksFromStringByRegex();
}
static List<string> GetAllLinksFromStringByRegex()
{
string myHtmlString = BuildHtmlString();
string txtFileExp = "href=\"([^\\\"]*\\.txt)\"";
List<string> foundTextFiles = new List<string>();
MatchCollection textFileLinkMatches = Regex.Matches(myHtmlString, txtFileExp, RegexOptions.IgnoreCase);
foreach (Match m in textFileLinkMatches)
{
foundTextFiles.Add( m.Groups[1].ToString()); // this is your captured group
}
return files;
}
static string BuildHtmlString()
{
return new StringReader(@"<html><head><title>Blah</title></head><body><br/>
<div>Here is your first text file: <a href=""http://myServer.com/blah.txt""></div>
<span>Here is your second text file: <a href=""http://myServer.com/blarg2.txt""></span>
<div>Here is your third text file: <a href=""http://myServer.com/bat.txt.snarg""></div>
<div>Here is your fourth text file: <a href=""http://myServer.com/somefile.txt""></div>
<div>Thanks for visiting!</div></body></html>").ReadToEnd();
}
}
}