Извлечение и построение таблиц из файлов HTML с использованием 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, но не могу найти подробную документацию / учебники.

2 ответа

Таким образом, Gumbo.jl проанализирует HTML и предоставит вам программное представление структуры файла HTML (называемого DOM - объектная модель документа). Обычно это дерево тегов html, которые вы можете просматривать и извлекать нужные данные.

Чтобы упростить эту задачу, вам действительно нужен способ запроса DOM, чтобы вы могли извлекать необходимые данные без необходимости обходить все дерево самостоятельно. Проект Cascadia.jl делает это для вас. Он построен поверх Gumbo и использует селекторы CSS в качестве языка запросов.

Так что для вашего примера вы можете использовать что-то вроде следующего, чтобы извлечь все 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

Надеюсь, это даст вам представление о том, как извлечь все необходимые данные.

Текущий ответ немного устарел, так как readall() функция больше не существует. Я обновлю его ответ ниже.

Вот общая разбивка экосистемы пакетов для Юлии (на момент написания этого ответа):

  • Запросы используются для загрузки самого файла HTML (обратите внимание, что в ответе Авика он читает файл HTML со своего локального компьютера)
  • Cascadia требуется для поиска тегов CSS (например, тега, который вы найдете, если будете использовать гаджет Selector).
  • Gumbo требуется для анализа результирующего HTML

Важно помнить, что Gumbo хранит объекты в древовидном формате как HTMLNode с или HTMLElement s. Таким образом, у большинства объектов есть "родители" и "дети". Чтобы получить необходимые данные, достаточно просто отфильтровать их с помощью правильного селектора (используя Cascadia), а затем перейти к правильной точке в дереве Gumbo.

Обновленная версия ответа Авика:

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 с простым примером, который, надеюсь, поможет вам лучше понять рабочий процесс.

Другие вопросы по тегам