2014-12-15 3 views
3

PowerShell을 사용하여 HTML 파일에서 배열을 만들고 싶습니다.Windows PowerShell은 HTML 로컬 파일을 구문 분석합니다.

Mozilla Firefox 개발자 에디션 (색인 파일을 다운로드 중입니다)에서 HTML 파일을 다운로드하는 스크립트를 사용하고 있으며이를 구문 분석하여 선택 요소의 값을 얻고 싶습니다. id는 id_country로 설정됩니다.

XPath를 사용하도록 권장되었지만 파일을 구문 분석하고 결과에서 배열을 작성하는 방법을 파악할 수 없습니다. 어쩌면 정규식을 사용하는 것이 해결책이 될 수 있습니다.

http://pastebin.com/b8cShFLA

그리고 여기에 옵션의 모든 요소 값 싶습니다 :

HTML 파일은 여기

나는 꽤입니다 ...

<select aria-required="true" id="id_country" name="country" required="required"> 
    <option value="af">Afghanistan</option> 
    <option value="al">Albania</option> 
    <option value="dz">Algeria</option> 
    <option value="as">American Samoa</option> 
    <option value="ad">Andorra</option> 

PowerShell에 익숙하지 않아서 내가 사용할 수있는 다른 솔루션을 실제로 알지 못합니다. 나는 패키지 인스톨러의 일부이기 때문에 아주 빠른 것을 필요로 할 것이다.

기본적으로 스크립트는 사용자 컴퓨터의 로케일과 일치하는 설치 프로그램이 있는지 확인하려고 시도합니다. 그렇지 않은 경우 영어로 기본 설정되어 있기 때문에 firefox dev을 확인하려면 해당 목록의 값을 가져와야합니다 사용 가능한 로케일.

감사합니다, O

답변

5

수정할 코드 샘플이 표시되지 않으므로 작성하겠습니다.

원격 HTML 인 경우 Invoke-WebRequest을 사용 하겠지만 로컬 파일에는 그다지 잘 작동하지 않습니다.

로컬 파일을 구문 분석하려면 HTML Agility Pack을 사용하여 HTML 파일을 구문 분석 한 다음 xPath를 사용하여 원하는 옵션을 얻는 것이 좋습니다. 전의.

Add-Type -Path .\HTMLAgilityPack\HtmlAgilityPack.dll 
$url = (get-item .\b8cShFLA.html).FullName 

$doc = New-Object HtmlAgilityPack.HtmlDocument 
$doc.LoadHtml((get-content $url)) 

#Create hashtable to store data in 
$langs = @{} 

$doc.DocumentNode.SelectSingleNode("//select[@name='country']").SelectNodes("option") | ForEach-Object { 
    $short = $_.Attributes[0].Value 
    $long = $_.NextSibling.InnerText 

    #Store data in hashtable 
    $langs[$short] = $long 
} 

$langs 

OUPUT : 대부분의 HTML에 대한

Name       Value 
----       ----- 
rw        Rwanda 
tv        Tuvalu 
to        Tonga 
pn        Pitcairn 
bh        Bahrain 
lc        Saint Lucia 
5

당신은 PS 3.0을 실행하는 경우 또는 그 이상, 당신은 웹상에서 존재하는 페이지에 대한 Invoke-WebRequest을 활용할 수 있습니다. 로컬 파일에 대해 작업하는 경우 it can be a bit finicky.

Invoke-WebRequest는 ParsedHtml이라는 속성으로 HtmlWebResponseObject을 반환합니다. 이 객체에는 getElementById라는 메소드가 있습니다.이 태그는 select 태그의 id "id_country"를 알고 있으므로 사용할 수 있습니다. 거기에서 옵션 태그를 반복하고 필터를 사용하여 "Text"및 "value"와 같은 속성을 반환하는 것이 간단합니다.

예는 아래의 국가 이름 및 국가 코드를 포함하는 사용자 지정 개체를 출력

:

코드 :

# I'm using your raw pastebin endpoint for this example 
$result = Invoke-WebRequest "http://pastebin.com/raw.php?i=b8cShFLA" 

# Only return specific properties from the elements you're looking for 
$countries = $result.ParsedHtml.getElementById("id_country") | 
    Where tagName -eq "option" | 
    Select -Property Text, Value 

# Country name and code are stored to this variable 
$countries 

출력 :

text              value 
----              ----- 
Afghanistan             af 
Albania              al 
Algeria              dz 
American Samoa            as 
Andorra              ad 
...               ... 

그런 다음 국가 이름을 사용할 수 있으며 코드는 PowerShell 객체의 다른 속성과 동일합니다.

웹 엔드 포인트의 경우,이 HTML을 추출하는 원래 Mozilla 페이지를 가리 키도록이 스크립트를 수정할 수있는 것처럼 들립니다.

0

또 다른 옵션은 XML의 파일을로드하고 그런 식으로 사용하는 것입니다. 내 PowerShell을 텀블러 파일 다운에서 예를 참조하십시오

https://github.com/jefflomax/powershell-download-tumbler-images

+0

이 일반적으로하지 않은 HTML, 내용이 잘 형성되어 가정합니다. –

관련 문제