2017-03-20 1 views
2

여기에 예제 HTML 파일 인 public link이 있습니다. 파일에서 CAN 및 연례 세금 정보 (아래 이미지의 빨간색으로 강조 표시된 예제)의 각 세트를 추출하고 아래의 데이터 프레임을 구성하고 싶습니다.Julia를 사용하여 HTML 파일에서 표 추출 및 구성

대상 필드

enter image description here

예 DataFrame

| Row |   CAN | Crtf_NoCrtf | Tax_Year | Land_Value | Improv_Value | Total_Value | Total_Tax | 
 
|-----+--------------+-------------+----------+------------+--------------+-------------+-----------| 
 
| 1 | 184750010210 | Yes   |  2016 |  16720 |  148330 |  165050 | 4432.24 | 
 
| 2 | 184750010210 | Yes   |  2015 |  16720 |  128250 |  144970 | 3901.06 | 
 
| 3 | 184750010210 | Yes   |  2014 |  16720 |  109740 |  126460 | 3412.63 | 
 
| 4 | 184750010210 | Yes   |  2013 |  16720 |  111430 |  128150 | 3474.46 | 
 
| 5 | 184750010210 | Yes   |  2012 |  16720 |  99340 |  116060 | 3146.17 | 
 
| 6 | 184750010210 | Yes   |  2011 |  16720 |  102350 |  119070 | 3218.80 | 
 
| 7 | 184750010210 | Yes   |  2010 |  16720 |  108440 |  125160 | 3369.97 | 
 
| 8 | 184750010210 | Yes   |  2009 |  16720 |  113870 |  130590 | 3458.14 | 
 
| 9 | 184750010210 | Yes   |  2008 |  16720 |  122390 |  139110 | 3629.85 | 
 
| 10 | 184750010210 | Yes   |  2007 |  16720 |  112820 |  129540 | 3302.72 | 
 
| 11 | 184750010210 | Yes   |  2006 |  12380 |  112760 |    | 3623.12 | 
 
| 12 | 184750010210 | Yes   |  2005 |  19800 |  107400 |    | 3882.24 |

추가 정보

이 삽입 할 수없는 경우 각 행에 대한 CAN은 괜찮습니다. CAN 번호를 별도로 내보내고 세금 값이 들어있는 데이터 프레임에 연결할 수 있습니다. 나는 파이썬을위한 아름다운 수프를 사용하는 방법을 모색했지만 Python을 사용하는 초심자이며 필자가 작성한 나머지 스크립트는 줄리아에 있으므로 모든 것을 하나의 언어로 유지하는 것을 선호한다.

달성하려는 목표를 달성 할 수있는 방법이 있습니까? Gumbo.jl을 보았지만 자세한 설명서/자습서를 찾을 수 없습니다.

+4

당신이 가지고있는 downvote는 아마도 약간 가혹한 것이지만, 그 질문은 당신이 어떤 문서를 찾는 것 외에는 아무것도 시도하지 않았다는 증거가 없기 때문에 주어진 것 같아요. (그렇습니다. 누구든지 그것을 준 사람은 코멘트를 남겨야했습니다. 설명). 어쩌면 몇 가지를 시도해 본 다음 여기에 코드를 게시하면 더 나은 응답을 얻을 수 있습니다. –

+0

@ColinTBowers라는 시간을내어 주셔서 감사합니다. 정확한 방향으로 올바른 코드 조각을 찾을 수 있는지 시도한 코드를 살펴 보겠습니다. –

+0

https://github.com/bicycle1885/EzXML.jl을 확인하십시오. –

답변

3

그래서 Gumbo.jl은 HTML을 구문 분석하고 HTML 파일의 구조를 프로그래밍 방식으로 표현합니다 (DOM - Document Object Model이라고 함). 이것은 일반적으로 html 태그의 트리로, 필요한 데이터를 트래버스하고 추출 할 수 있습니다.

이 작업을보다 쉽게 ​​수행하려면 실제로 트리를 트래버스하지 않고도 필요한 데이터를 추출 할 수 있도록 DOM을 쿼리하는 방법이 정말로 필요합니다. Cascadia.jl 프로젝트가이 작업을 수행합니다. Gumbo 위에 구축되었으며 쿼리 언어로 CSS selectors을 사용합니다.

은 그래서 예를 들어, 당신은 모든 CAN 필드를 추출하기 위해 다음과 같은 것을 사용할 수 있습니다
julia> using Gumbo 

julia> using Cascadia 

julia> h=parsehtml(readall("/Users/aviks/Download/z1.html")) 

julia> c = matchall(Selector("td:containsOwn(\"CAN:\") + td span"), h.root) 
    13-element Array{Gumbo.HTMLNode,1}: 
    Gumbo.HTMLElement{:span}: 
    <span class="value">184750010210</span> 
    ... 
#print all the CAN values 
julia> for x in c 
       println(x.children[1].text) 
      end 

    184750010210 
    186170040070 
    175630130020 
    172640020290 
    168330020230 
    156340030160 
    118210000020 
    190490040500 
    173480080430 
    161160010050 
    153510060090 
    050493000250 
    050470630910 

는 희망이 당신에게 당신이 필요로하는 모든 데이터를 추출하는 방법에 대한 아이디어를 제공합니다.

1

readall() 함수가 더 이상 존재하지 않기 때문에 현재 답변이 약간 오래된 것입니다. 아래에서 그의 답변을 업데이트하겠습니다. 그는, avik의 대답에 HTML 파일 자체 (참고를 다운로드하는 데 사용됩니다

  • 요청 :

    여기 (이 답변을 작성하는 시간으로) 줄리아의 패키지 생태계의 일반적인 고장입니다 자신의 로컬 컴퓨터에서 HTML 파일을 읽음)

  • CSS 태그 (예 : Selector Gadget을 사용하는 경우 찾을 수있는 태그)를 검색하려면 Cascadia이 필요합니다.
  • 검보는 결과 HTML

을 기억해야 할 중요한 일을 구문 분석 할 필요가 검보의 저장 HTMLNode의 또는 HTMLElement들로 트리 형식으로 객체이다.따라서 대부분의 객체에는 "부모"와 "자식"이 있습니다. 필요한 데이터를 얻으려면 오른쪽 선택기 (Cascadia 사용)로 필터링 한 다음 Gumbo 트리의 올바른 지점으로 이동하면됩니다.

avik의 대답의 업데이트 된 버전 : 그것은 좋은 CSS 구조를 가지고 있지 않기 때문에

using Requests, Cascadia, Gumbo 

# r = get(url) # Normally, you'd put a url here, but I couldn't find a way to grab it without having to download it and read it locally 
# h = parsehtml(String(r.data)) # Then normally you'd execute this 

# Instead, I'm going to read in the html file as a string and give it to Gumbo 
h = parsehtml(readstring("z1.html")) 

# Exploring with the various structure of Gumbo objects: 
println(fieldnames(h.root)) 
println(fieldnames(h.root.children)) 
println(size(h.root.children)) 

# aviks code: 
c = matchall(Selector("td:containsOwn(\"CAN:\") + td span"), h.root); 
for x in c 
    println(x.children[1].text) 
end 

이 특정 웹 페이지, 대부분의보다 긁히지 더 어렵다.

Cascadia README의 워크 플로우에 대한 훌륭한 문서가 있지만 읽은 후에도 몇 가지 질문이 있습니다. Julia에서 웹 스크랩에 대한 지침을 찾고있는이 페이지의 사용자 (나 같은 분)에게 나는 워크 플로를 더 자세히 이해하는 데 도움이되는 간단한 예제를 사용하여 jupyter notebook을 만들었습니다.

+0

HI @Tyler R, Cascadia에 관한 질문이 있으면 저장소에서 문제를 제기하십시오. 문서에 대한 개선이 많이 감사합니다. – aviks

+0

좋은 소리, @aviks –

관련 문제