簡體   English   中英

使用Julia從HTML文件中提取和構造表

[英]Extracting and Constructing Tables from HTML Files using Julia

這是一個示例html文件的公共鏈接 我想從文件中提取每組CAN和年度稅務信息(下圖中以紅色突出顯示的示例),並構建一個類似於下面的數據框。

目標字段

在此輸入圖像描述

示例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湯,但我是python的絕對新手,我寫的其余腳本都是Julia,所以我更喜歡用一種語言保存所有內容。

有沒有辦法實現我想要實現的目標? 我看過Gumbo.jl但找不到任何詳細的文檔/教程。

因此Gumbo.jl將解析HTML並為您提供HTML文件結構的編程表示(稱為DOM - 文檔對象模型)。 這通常是一個html標簽樹,您可以遍歷並提取所需的數據。

為了使這更容易,您真正想要的是一種查詢DOM的方法,這樣您就可以提取所需的數據,而無需自己遍歷整個樹。 Cascadia.jl項目為您完成此任務。 它建立在Gumbo之上,並使用CSS選擇器作為查詢語言。

因此,對於您的示例,您可以使用以下內容來提取所有CAN字段:

julia> using Gumbo

julia> using Cascadia

julia> h=parsehtml(read("/Users/aviks/Download/z1.html", String))

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

希望這能讓您了解如何提取所需的所有數據。

由於readall()函數不再存在,因此當前答案有點過時了。 我將在下面更新他的答案。

以下是Julia軟件包生態系統的一般細分(截至編寫本答案時):

  • Requests.jl用於下載HTML文件本身(注意,在avik的回答中,他從本地機器讀取HTML文件)
  • Cascadia.jl需要搜索CSS標簽(例如,如果您使用Selector Gadget ,則會找到標簽)。
  • Gumbo.jl需要解析生成的HTML

要記住的關鍵是Gumbo將樹格式的對象存儲為HTMLNodeHTMLElement 所以大多數對象都有“父母”和“孩子”。 要獲得所需的數據,只需使用正確的選擇器(使用Cascadia)進行過濾,然后轉到Gumbo樹中的正確點。

avik答案的更新版本:

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

這個特定的網頁比大多數網頁更難刮,因為它沒有很好的CSS結構。

關於Cascadia README的工作流程有一些很好的文檔,但在閱讀之后我仍然有一些問題。 對於其他人(像我這樣的,昨天)誰到這個頁面尋找朱莉婭刮幅面導向,我創建了一個jupyter筆記本用一個簡單的例子,希望能幫助您了解更詳細的工作流程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM