Моя цель — очистить эту страницу, собрать данные в первой таблице и экспортировать их в CSV-файл:
https://www.interactivebrokers.co.uk/en/trading/margin-futures-fops.php
Маржинальные требования Чикагская торговая биржа (CBOT):
$WebResponse = Invoke-WebRequest -Uri "https://www.interactivebrokers.co.uk/en/trading/margin-futures-fops.php"
$table = ($WebResponse.AllElements | Where {$_.class -match 'table-responsive'}).outerhtml
Однако запрос по-прежнему возвращает МНОГО HTML. Может ли кто-нибудь пролить свет на это, чтобы приблизить меня к моей цели? Заранее спасибо.
Хороший вопрос по поводу фильтрации, @mclayton. Обратите внимание, что на этом этапе страница уже правильно проанализирована и доступен полный доступ к DOM (поэтому нет необходимости иметь дело с .OuterHtml
— хотя он основан на устаревшем движке Internet Explorer, доступном только в Windows PowerShell.
Если вы хотите извлечь данные из таблицы HTML, я рекомендую воспользоваться существующими инструментами, которыми поделились другие. Если вы посмотрите на модуль PowerShell PSParseHtml , в нем есть функция ConvertFrom-HtmlTable
. В этом модуле используются другие замечательные инструменты, которые сделают это проще простого для нас с вами. Спасибо PrzemyslawKlys!
Мы установим модуль.
Install-Module -Name PSParseHTML -Force
Затем мы извлечем HTML с помощью базового регулярного выражения. (Преимущество -UseBasicParsing
больше не зависит от компонентов Internet Explorer)
$url = 'https://www.interactivebrokers.co.uk/en/trading/margin-futures-fops.php'
$content = Invoke-WebRequest $url -UseBasicParsing
$content -match '(?s)<div id = "cbot.+?/div>' | Out-Null
Наконец, мы передадим выбранный фрагмент HTML в функцию.
$tabledata = ConvertFrom-HTMLTable -htmlString $matches.Values -all
Теперь содержимое таблицы хорошо проанализировано и сохранено в $tabledata
. Оттуда вы можете проверить его, экспортировать и т. д.
$tabledata | Format-Table
$tabledata | Out-GridView
$tabledata | Export-Csv -Path \path\to\file.csv -NoType
Большое спасибо за советы, Даг! Очень полезно. Я никогда раньше не анализировал этот модуль и уверен, что это упрощает задачу! Мне пришлось немного изменить сценарий, чтобы он заработал. Это был готовый продукт. code
$url = 'interactivebrokers.co.uk/en/trading/margin-futures-fops.php ' $content = (Invoke-WebRequest $url -UseBasicParsing).content $content -match '(?s )<div id = "cbot.+?/div>' | Out-Null $tabledata = ConvertFrom-HTMLTable -Content $matches.Values $tabledata | Format-Table $tabledata | Out-GridView $tabledata | Export-Csv -Path \путь\к\файлу.csv -NoType code
Рад, что это помогло. Format-Table и Out-Gridview предназначены для просмотра данных. Они вам не нужны при экспорте. Просто сделайте $tabledata | Export-Csv
Ваш код получает
outerhtml
для каждой таблицы, потому что все они имеютclass='table-responsive'
на этой странице. Возможно, вам лучше начать с$div = ($WebResponse.AllElements | Where {$_.id -match 'cbot'})
, который получает уникального родителяdiv
для интересующей таблицы, а затем извлечь свой CSV изouterhtml
этого. Однако общепринятое мнение гласит, что любую обработку HTML лучше всего выполнять с помощью соответствующей библиотеки синтаксического анализа HTML, а не манипуляций со строками...