Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
1 / 1 / 2
Регистрация: 18.11.2013
Сообщений: 337

Парсинг данных с сайта

08.02.2018, 16:38. Показов 4694. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, при парсинге данных с сайте, где указаны фамилии по-русски в Powershell получается ерунда, прикладываю скриншот и код.
Я знаю, что проблема где-то в кодировке, просьба помочь
Кликните здесь для просмотра всего текста

PowerShell
1
2
3
4
$url_co = '...' 
 $res_co = Invoke-WebRequest $url_co
 $ADuser = @()
 $res_co.ParsedHtml.body.innerText
Миниатюры
Парсинг данных с сайта  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.02.2018, 16:38
Ответы с готовыми решениями:

Парсинг данных с сайта или страницы сайта
Здравствуйте, добрые люди! Есть задача спарсить данные с страницы соц сети. Или просто со страницы с помощью js. На пхп не предлагать....

Парсинг данных с сайта
Есть удаленный сервер, тобиш сайт, на нем стоит рейтинг серверов. Мне нужно спарсить все сервера имеющиеся в рейтинге и если добавится...

Парсинг данных с сайта
Работаю с HTML Agility Pack. Нужно считать данные с таблицы сайта. public Form1() { string url =...

20
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
08.02.2018, 17:00
ilya0610, а что в заголовках запроса? Charset не пробовали указать windows-1251?
0
1 / 1 / 2
Регистрация: 18.11.2013
Сообщений: 337
08.02.2018, 17:19  [ТС]
greg zakharov, Писал в командлете invoke-webrequest -ContentType "windows-1251", но не помогло
Или вы о другом, можно пример
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
08.02.2018, 17:34
Цитата Сообщение от ilya0610 Посмотреть сообщение
Я знаю, что проблема где-то в кодировке, просьба помочь
Вот так на экране появляется кириллица?

PowerShell
1
2
3
$utf8 = [System.Text.Encoding]::GetEncoding(65001)
$win1251 = [System.Text.Encoding]::GetEncoding(1251)
$utf8.GetString($win1251.GetBytes((Invoke-WebRequest $url_co).Content))
Или так?

PowerShell
1
2
3
$utf8 = [System.Text.Encoding]::GetEncoding(65001)
$iso88591 = [System.Text.Encoding]::GetEncoding(28591)
$utf8.GetString($iso88591.GetBytes((Invoke-WebRequest $url_co).Content))
1
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
08.02.2018, 19:12
Цитата Сообщение от ilya0610
Или вы о другом, можно пример
Сперва шлете HEAD запрос и получаете корректную кодировку:
PowerShell
1
$enc = (Invoke-WebRequest -Method Head host).Headers.'Content-Type'[0].Split('=')[1]
Эту же кодировку используете при запросе содержимого страницы.
0
1 / 1 / 2
Регистрация: 18.11.2013
Сообщений: 337
09.02.2018, 08:20  [ТС]
greg zakharov, KDE777, получилось сделать вот так:
PowerShell
1
2
3
4
5
$url_co = '...' 
$mass_all_user = @()
$win1251 = [System.Text.Encoding]::GetEncoding(1251)
$iso = [System.Text.Encoding]::GetEncoding('iso-8859-1')
$res = $win1251.GetString($iso.GetBytes((Invoke-WebRequest $url_co).ParsedHtml.body.innerText))
Можете пояснить, как данные значения положить в массив, чтобы выводить нужную строку, пробовал с объектами и массивом, но показывает значение, как одна большая строка
Миниатюры
Парсинг данных с сайта  
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
09.02.2018, 09:53
Цитата Сообщение от ilya0610 Посмотреть сообщение
Можете пояснить, как данные значения положить в массив, чтобы выводить нужную строку, пробовал с объектами и массивом, но показывает значение, как одна большая строка
PowerShell
1
$mass_all_user = $res -split "`r`n"
Добавлено через 2 минуты
или

PowerShell
1
$mass_all_user = $res -split [environment]::NewLine
1
1 / 1 / 2
Регистрация: 18.11.2013
Сообщений: 337
09.02.2018, 18:06  [ТС]
KDE777, Если получился массив, как из него потом взять данные, я имею ввиду следующее, если строка это содержит, какую информацию, то вывести данную строку
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
09.02.2018, 22:50
Лучший ответ Сообщение было отмечено ilya0610 как решение

Решение

Цитата Сообщение от ilya0610 Посмотреть сообщение
Если получился массив, как из него потом взять данные, я имею ввиду следующее, если строка это содержит, какую информацию, то вывести данную строку
Ну это совсем основы.

PowerShell
1
2
3
4
5
6
$str = 'Иванов Семён Васильевич
Васильев Иван Николаевич
Николаев Василий Петрович
Иванов Василий Семёнович'
 
$a = $str -split [environment]::NewLine
Находим точное совпадение:
PowerShell
1
$a | Where {$_ -eq 'Васильев Иван Николаевич'}
Code
1
Васильев Иван Николаевич
Выбираем по wildcard маске:
PowerShell
1
$a | Where {$_ -like 'Иванов*'}
Code
1
2
Иванов Семён Васильевич
Иванов Василий Семёнович
Ищем любое вхождение:
PowerShell
1
$a | Where {$_ -match 'Иван'}
Code
1
2
3
Иванов Семён Васильевич
Васильев Иван Николаевич
Иванов Василий Семёнович
И ещё множество разных способов...
1
 Аватар для volodin661
6673 / 2266 / 346
Регистрация: 10.12.2013
Сообщений: 7,833
10.02.2018, 09:22
Цитата Сообщение от KDE777 Посмотреть сообщение
И ещё множество разных способов...
select-string же.

-split "Графиня изменившимся лицом бежит пруду" | sls "и"
  • Графиня
  • изменившимся
  • лицом
  • бежит
-split "Графиня изменившимся лицом бежит пруду" | sls -Not "и"
  • пруду
0
10.02.2018, 12:00

Не по теме:

Цитата Сообщение от volodin661 Посмотреть сообщение
select-string же
Да конечно, Select-String ещё и быстрее. Просто если человек задаёт такой вопрос, то я подумал, что лучше начать с самого начала - любимого всеми Where-Object, который потом всё равно много где пригодится...

0
1 / 1 / 2
Регистрация: 18.11.2013
Сообщений: 337
12.02.2018, 10:49  [ТС]
KDE777, А можно еще немного основ, как данные которые мы выбрали из массива, передать в другой массив или переменную для дальнейшей обтработки

Добавлено через 7 минут
KDE777, Все нашел Out-String мне в помощь
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
12.02.2018, 11:19
Цитата Сообщение от ilya0610 Посмотреть сообщение
как данные которые мы выбрали из массива, передать в другой массив или переменную для дальнейшей обтработки
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$str = 'Иванов Семён Васильевич
Васильев Иван Николаевич
Николаев Василий Петрович
Иванов Василий Семёнович'
$a = $str -split [environment]::NewLine
 
# передать в переменную (создать новый массив)
$a1 = $a | Where {$_ -match 'Иван'}
 
$a2 = 'Чичиков Павел Иванович','Собакевич Михаил Семенович'
 
# передать в другой массив (вернее добавить в конец другого массива)
$a2 += $a | Where {$_ -match 'Иван'}
 
"A:"; $a
"A1:"; $a1
"A2:"; $a2
Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
A:
Иванов Семён Васильевич
Васильев Иван Николаевич
Николаев Василий Петрович
Иванов Василий Семёнович
A1:
Иванов Семён Васильевич
Васильев Иван Николаевич
Иванов Василий Семёнович
A2:
Чичиков Павел Иванович
Собакевич Михаил Семенович
Иванов Семён Васильевич
Васильев Иван Николаевич
Иванов Василий Семёнович
1
1 / 1 / 2
Регистрация: 18.11.2013
Сообщений: 337
12.02.2018, 12:24  [ТС]
KDE777, такой еще вопрос, как определить индекс вхождения первой буквы в строке?
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
12.02.2018, 15:05
Цитата Сообщение от ilya0610 Посмотреть сообщение
такой еще вопрос, как определить индекс вхождения первой буквы в строке?
PowerShell
1
2
3
$str = '123 Я и Ваня'
$result = [regex]::Match($str,'[A-zА-я]')
if ($result.Success) {$result.Index}
А можете сразу объяснить, что в конечном итоге вы хотите получить?
1
1 / 1 / 2
Регистрация: 18.11.2013
Сообщений: 337
12.02.2018, 15:57  [ТС]
KDE777, У меня есть строка 6924P02303Глотова Елена765
Я хочу из нее выделить P02303, но данные значения естественно отличаются, вначале может быть от 3-5 символов, после буквы до фамилии тоже от 3-6 символов и вот данные значения хочу обработать и вывести их
0
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
12.02.2018, 16:14
ilya0610, просто бейте на подгруппы, например:
Code
1
2
3
4
5
6
7
8
9
10
PS E:\sandbox> $s = '6924P02303Глотова Елена765'
PS E:\sandbox> $s -match '(?i:(\d+)([a-zа-яё]\d+)(.+))';$matches
True
 
Name                           Value
----                           -----
3                              Глотова Елена765 # $matches[3]
2                              P02303           # $matches[2]
1                              6924             # $matches[1]
0                              6924P02303Глотова Елена765
1
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
12.02.2018, 17:03
Цитата Сообщение от ilya0610 Посмотреть сообщение
У меня есть строка 6924P02303Глотова Елена765
Судя по вашей картинке из первого поста:
- первая часть это: [число][одна буква][число]
- вторая часть это: [число]
- между этими частями ФИ(иногда О), разделённые пробелами

Если это всегда так, тогда можно сделать примерно так:

PowerShell
1
2
3
4
5
6
7
8
9
$str =
'1234A4321Иванов Семён Васильевич567
1234B4321Васильев Иван567
1234А4321Николаев Василий Петрович567
1234Б4321Иванов Василий567'
 
$a = ([regex]::Matches($str,'([А-яёЁ]+ [А-яёЁ]+[А-яёЁ ]*)')).Value
 
$a
Code
1
2
3
4
Иванов Семён Васильевич
Васильев Иван
Николаев Василий Петрович
Иванов Василий
И исходный текст, в этом варианте уже не нужно разбивать на строчки.

Добавлено через 12 минут
+ ещё вариант:

PowerShell
1
$a = $str -replace '\d+[A-zА-яёЁ]\d+|\d'
1
1 / 1 / 2
Регистрация: 18.11.2013
Сообщений: 337
12.02.2018, 17:43  [ТС]
greg zakharov, объясните разбития на подгруппы, почему выбранно именно так (?i\d+)([a-zа-яё]\d+)(.+))

Добавлено через 3 минуты
KDE777, мне важно именно выделять первую букву в строке и символы до фамилии после нее, поскольку это некий идентификатор человека
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
12.02.2018, 17:57
Лучший ответ Сообщение было отмечено ilya0610 как решение

Решение

Цитата Сообщение от ilya0610 Посмотреть сообщение
мне важно именно выделять первую букву в строке и символы до фамилии после нее
Понятно, сначала не обратил внимание. Тогда, например так:

PowerShell
1
2
3
4
5
6
7
$str =
'1234A4321Иванов Семён Васильевич567
1234B4321Васильев Иван567
1234А4321Николаев Василий Петрович567
1234Б4321Иванов Василий567'
 
[regex]::Matches($str,'\d+([A-zА-я]\d+)') | %{$_.Groups[1].Value}
Code
1
2
3
4
A4321
B4321
А4321
Б4321
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.02.2018, 17:57
Помогаю со студенческими работами здесь

Парсинг данных с сайта
Помогите пожалуйста составить регулярное выражение для задания : (Определить количество книг по жанрам на произвольном сайте библиотеки или...

Парсинг данных с сайта
Ребят помогите спарсить данные с https://www.marathonbet.ru/su/betting/11?periodGroupAllEvents=2 нужно спарсить все матчи в массив только...

Парсинг данных с сайта
Добрый вечер, есть проблема : Мне надо парсить количество поставленных денег на каждую из команд на на данном сайте (del). Дело в...

Парсинг данных с сайта
Всем привет, хочу сделать парсинг новостей с сайта, с использованием jsoup. Информация парсится, но парсится всё а не только ссылка и...

Парсинг данных с сайта с javascript
Есть сайт с некими данными (раз в день обновляемыми, потому и нужна программа), данные выдаются примерно следующим образом: 1....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru