Получить значение 'href' из следующего кода? - PullRequest
0 голосов
/ 23 ноября 2010

Мне нужно получить значение href из HTML, как показано ниже в C #:

<td class="tl"><a href="http://facebook.com/"target="_blank"><img src="images/poput_icon.png"/></a>

Может кто-нибудь показать мне, как это сделать? RegEx - лучший подход? Мне нужно собрать их со страницы, которая содержит сотни ссылок, но все они похожи на приведенный выше код. Я хочу игнорировать другие ссылки на странице.

Заранее спасибо.

Jimmy

Ответы [ 2 ]

1 голос
/ 23 ноября 2010

Я бы сделал это с помощью регулярного выражения, да.Итак, вы хотите найти значение внутри тега привязки, окружающего тег img в начале ячейки таблицы?

Вот код C # для создания Regex объекта, который будет соответствовать таким ссылкам,затем используйте его, где document - это строка, содержащая весь документ для поиска:

Regex linkscraper = new Regex(@"<\s*td[^>]*>\s*<\s*a[^>]*href\s*=\s*""(?<link>[^""]*)""[^>]>\s*<\s*img[^>]*>\s*<\s*\/a\s*>");
MatchCollection links = linkscraper.matches(document);

Соответствующие ссылки находятся в Соответствующих объектах в коллекции Links с именем группы "link".

Ведущий @ превращает это в необработанную строку: все \ передаются напрямую, а не обрабатываются, поэтому мы не обязаны удваивать их, чтобы разрешить регулярное выражение \ поведение.Поскольку кавычки нельзя экранировать с помощью \ "в необработанной строке, они экранируются с помощью" ".

Это довольно сложное регулярное выражение. Разбиваем его на части:

  • Он забрызган кучей \s* элементов, что примерно означает «любой пробел или ни одного». Это заставляет ваше выражение linkscraper игнорировать изменения в интервале, разрешенные HTML.
  • Класс [^>] соответствует любому символу, который не является'> "; повторение этого (завершающий *) представляет собой" другие вещи внутри тега, которые нас не интересуют ". Исключение состоит в том, чтобы запретить регулярному выражению выходить из строя и выходить за пределы тега. Регулярные выражения являются жаднымитак что он будет весело совпадать с первой частью первого тега в документе, продолженной вплоть до конца последнего, если мы этого не сделаем.
  • С учетом всех этих объяснений все относительно просточтобы понять:
    • тег TD (который может иметь или не иметь пробелы или атрибуты), за которым сразу же следует (для определения «немедленно», чемt допускает произвольные пробелы)
    • a Тег, в котором href записывается в группу захвата с именем «link».[^""], который является экранированной формой [^"], соответствует всем символам без кавычек.Нас не волнует остальная часть тега.
    • Тег img, который может содержать все, что он хочет.
    • Закрывающий тег /.

Если вы знаете больше о точном форматировании документа, из которого вы пытаетесь извлечь ссылки, вы можете сократить это регулярное выражение.В частности, группы [^>]*, блоки «соответствовать нулю или более символов, которые не являются>», используемые для того, чтобы теги могли содержать все, что они хотят, вероятно, должны быть заменены подвыражениями, более специфичными для фактического документа.Это поймает что-нибудь в форме <TD><A href=...><IMG></a>, которая может соответствовать или не соответствовать больше, чем вы хотите.

1 голос
/ 23 ноября 2010

Во-первых, не используйте регулярные выражения для анализа XML.См. Здесь более подробную информацию о причинах и причинах .

Во-вторых, вы можете использовать LINQ-to-XML для достижения этой цели.Предполагая, что вы загрузили свой фрагмент XML в экземпляр XDocument (и, следовательно, td является корневым элементом), вы можете сделать следующее:

var href = doc
    .Element("td")
    .Element("a")
    .Attribute("href")
    .Value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...