Используя регулярные выражения C# для удаления HTML-тэгов

Вам нужно переключиться на iframe.

Например,

iframe = driver.find_element_by_id('destination_publishing_iframe_autodesk_0')
driver.switch_to.frame(iframe)
driver.find_element_by_name('userName').send_keys('xxx')

См. Функцию switch_to здесь: https://selenium-python.readthedocs.io/api.html?highlight=iframe

Для справки:

[ 118] Python Selen не может найти iframe xpath

https://seleniumwithjavapython.wordpress.com/selenium-with-python/intermediate-topics/handling-iframes-in-a -webpage /

137
задан Keltex 25 April 2009 в 03:12
поделиться

4 ответа

As often stated before, you should not use regular expressions to process XML or HTML documents. They do not perform very well with HTML and XML documents, because there is no way to express nested structures in a general way.

You could use the following.

String result = Regex.Replace(htmlDocument, @"<[^>]*>", String.Empty);

This will work for most cases, but there will be cases (for example CDATA containing angle brackets) where this will not work as expected.

149
ответ дан 23 November 2019 в 23:32
поделиться

Правильный ответ: не делайте этого, используйте HTML Agility Pack .

Отредактировано, чтобы добавить:

К бессовестно крадут из комментария ниже Джесси, и чтобы избежать обвинений в неадекватном ответе на этот вопрос после всего этого времени, вот простой, надежный фрагмент, использующий пакет Agility HTML, который работает даже с самыми несовершенно сформированными, капризными частями HTML:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(Properties.Resources.HtmlContents);
var text = doc.DocumentNode.SelectNodes("//body//text()").Select(node => node.InnerText);
StringBuilder output = new StringBuilder();
foreach (string line in text)
{
   output.AppendLine(line);
}
string textOnly = HttpUtility.HtmlDecode(output.ToString());

Существует очень мало оправданных случаев использования регулярного выражения для синтаксического анализа HTML, так как HTML не может быть проанализирован правильно без понимания контекста, которое очень трудно обеспечить даже в нетрадиционном движке регулярных выражений. Вы можете получить часть пути с RegEx, но вам нужно будет сделать ручные проверки.

Html Agility Pack может предоставить вам надежное решение, которое уменьшит необходимость вручную исправлять аберрации, которые могут возникнуть в результате наивного обращения с HTML как с контекстно-свободной грамматикой.

Регулярное выражение может дать вам в основном то, что вы хотите большую часть времени, но это не удастся в очень распространенных случаях. Если вы можете найти лучший / более быстрый парсер, чем HTML Agility Pack, сделайте это, но, пожалуйста, не подвергайте мир большему количеству взломанных HTML-хакеров.

78
ответ дан 23 November 2019 в 23:32
поделиться

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

  • удалить объявление
  • удалить все комментарии SGML
  • удалить весь элемент HEAD
  • удалить все элементы SCRIPT и STYLE
  • do Grabthar-знает-что с элементами FORM и TABLE
  • удалить оставшиеся теги
  • удалить последовательности из разделов CDATA, но оставить их содержимое в покое

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

Но, если вы Если вы работаете только с фрагментом, и вы можете просто удалить все теги, вот такое выражение, которое я бы использовал:

@"(?></?\w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>"

Сопоставление строк в одинарных и двойных кавычках в их собственных альтернативах достаточно для решения проблемы угловых скобок в значения атрибута. Я не вижу необходимости явно сопоставлять имена атрибутов и другие вещи внутри тега, как это делает регулярное выражение в ответе Райана; Первая альтернатива обрабатывает все это.

Если вам интересно узнать о тех конструкциях (?> ...) , это атомных групп . Они делают регулярные выражения немного более эффективными, но, что более важно, они предотвращают повторное отслеживание, на что вы всегда должны обращать внимание при смешивании чередующихся и вложенных квантификаторов, как я сделал. Я не думаю, что это будет проблемой здесь, но я знаю, если я не упомяну это, кто-то еще будет. ; -)

Это регулярное выражение, конечно, не идеально, но, вероятно, оно так хорошо, как вам когда-либо понадобится.

38
ответ дан 23 November 2019 в 23:32
поделиться
Regex regex = new Regex(@"</?\w+((\s+\w+(\s*=\s*(?:"".*?""|'.*?'|[^'"">\s]+))?)+\s*|\s*)/?>", RegexOptions.Singleline);

Source

25
ответ дан 23 November 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: