Извлечение строки из HTML веб-царапины - PullRequest
2 голосов
/ 15 марта 2019

Я ищу несколько советов по скрипту очистки, над которым я работаю.

Все идет хорошо, но я застрял при удалении данных файла изображения.

В настоящее время я делаю WebRequest, получаю элементы по классам, выбираю outerHTML, но мне нужно удалить только содержимое атрибута data-imagezoom в соответствии с этим примером.

Пример данных:

<a class="aaImg" href="https://imagehost.ssl.server123.com/Product-800x800/image.jpg">
    <img class="aaTmb" alt="Matrix 900 x 900 test" src="https://imagehost.ssl.server123.com/Product-190x190/image.jpg" item="image"
         data-imagezoom="https://imagehost.ssl.server123.com/Product-1600x1600/image.jpg" data-thumbnail="https://imagehost.ssl.server123.com/Product-190x190/image.jpg">
    </img>
</a>

Текущий код для получения этих данных:

$ProductInfo = Invoke-WebRequest -Uri $ProductURL
$ProductImageRaw = $ProductInfo.ParsedHTML.body.getElementsByClassName("aaImg") |
                   Select outerHTML

Очевидно, я могу получить первое изображение, легко выбрав атрибут href.

Я был «грязным кодировщиком», заменив 800x800 на 1600x1600, поскольку имена файлов совпадают, просто другой путь, но он довольно быстро отклеился, когда были несоответствия в именах путей.

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Вам необходимо получить доступ к дочернему элементу <img> внешнего элемента <a> и вызвать его .getAttribute() метод , чтобы получить интересующее значение атрибута:

$ProductInfo.ParsedHTML.body.getElementsByClassName("aaImg").
  childnodes[0].getAttribute('data-imagezoom')
  • .childnodes[0] возвращает первый дочерний узел (элемент)

  • .getAttributes('data-imagezoom') возвращает значение атрибута data-imagezoom. [1]

Это должно вернуть строку https://imagehost.ssl.server123.com/Product-1600x1600/image.jpg.


Что касается ваш собственный ответ :

Использование регулярное выражение (или поиск по подстроке) для анализа структурированных данных, таких как HTML и XML, имеет значение хрупкое и его лучше избегать.
Например, если исходный HTML изменяется на использование '...' вместо "..." вокруг значений атрибутов ваше решение ломается (этот конкретный случай не составляет труда объяснить в регулярном выражении, но есть много других способов, которыми такой синтаксический анализ может пойти не так).


Кроссплатформенная перспектива :

К сожалению, свойство .ParsedHTML с его HTML DOM доступно только в Windows PowerShell (и его реализация COM является громоздкой и медленной для работы в PowerShell).

PowerShell Core , даже в Windows, нене поддерживается, и нет встроенного парсера HTML, доступного (начиная с PowerShell Core 6.2.0).

HtmlAgilityPack NuGet является популярным открытымисходный HTML-анализатор, но он нацелен на C # и поэтому нетривиален для установки и использования в PowerShell.

Тем не менее, этот ответ от TheIncorrigible1 имеет рабочий примеркоторый загружает требуемую сборку по требованию.


[1] Обратите внимание, что .getAttribute() необходим для доступа к настраиваемым атрибутам, тогда как стандартным атрибутамтакие как id и, в случае <a> элементов, href, представлены непосредственно как свойства объекта (например, .id;обратите внимание, что .getAttribute() работает и со стандартными атрибутами.)

0 голосов
/ 15 марта 2019

Итак, после краткого ускоренного курса в каком-то Regex, это то, что я придумал.

(?<=data-imagezoom=").*?(?="\s)

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

Спасибо всем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...