如何抓取 HTML table 并使用 Bash 在终端上打印?

How to scrape a HTML table and print it on terminal using Bash?

我一直试图从这个网站上抓取(使用 BASH)table:http://www.tesouro.fazenda.gov.br/tesouro-direto-precos-e-taxas-dos-titulos,这是巴西政府债券的当前价格。我想开发一个脚本,为我提供相同的 table,格式化为终端输出,这样我就可以将它分配给别名并快速获取价格(并将其发布在 github 上,以便其他人可以将其用作好吧,甚至可以在其他代码上使用它)。

到目前为止我做了什么:

#!/bin/bash
url="http://www.tesouro.fazenda.gov.br/tesouro-direto-precos-e-taxas-dos-titulos"

lynx -source "$url" |
grep -o '<tbody>.*</tbody>' |
#gets the entire line
sed 's/\(<tr>\|<\/tr>\)//g' |  
sed 's/<[^>]*>//g'
#cleans the html tags

运行 "./script.sh > file.txt" 给我输出:

Investir Mercado Aberto 9h30min às 18h Preços e taxas dos títulos públicos disponíveis para investir Título Vencimento Indexador Taxa de Rendimento (% a.a.) Valor Mínimo Preço Unitário Indexados ao IPCA Tesouro IPCA+ 2024 (NTNB Princ) 15/08/2024 5,05 R,62 R.181,47 Tesouro IPCA+ 2035 (NTNB Princ) 15/05/2035 5,48 R,96 R.198,82 Tesouro IPCA+ 2045 (NTNB Princ) 15/05/2045 5,48 R,21 R4,20 Tesouro IPCA+ com Juros Semestrais 2026 (NTNB) 15/08/2026 5,10 R,72 R.272,36 Tesouro IPCA+ com Juros Semestrais 2035 (NTNB) 15/05/2035 5,35 R,63 R.263,54 Tesouro IPCA+ com Juros Semestrais 2050 (NTNB) 15/08/2050 5,42 R,55 R.355,64 Prefixados Tesouro Prefixado 2020 (LTN) 01/01/2020 8,40 R,84 R6,13 Tesouro Prefixado 2023 (LTN) 01/01/2023 10,20 R,58 R1,76 Tesouro Prefixado com Juros Semestrais 2027 (NTNF) 01/01/2027 10,36 R,69 R.023,16 Indexados à Taxa Selic Tesouro Selic 2023 (LFT) 01/03/2023 0,00 R,38 R.238,83 Resgatar Mercado Aberto 9h30min às 18h Preços e taxas dos títulos públicos disponíveis para resgatar Título Vencimento Indexador Taxa de Rendimento (% a.a.) Preço Unitário Indexados ao IPCA Tesouro IPCA+ 2019 (NTNB Princ) 15/05/2019 2,93 R.907,76 Tesouro IPCA+ 2024 (NTNB Princ) 15/08/2024 5,17 R.164,92 Tesouro IPCA+ 2035 (NTNB Princ) 15/05/2035 5,60 R.175,37 Tesouro IPCA+ 2045 (NTNB Princ) 15/05/2045 5,60 R2,63 Tesouro IPCA+ com Juros Semestrais 2020 (NTNB) 15/08/2020 4,17 R.221,84 Tesouro IPCA+ com Juros Semestrais 2024 (NTNB) 15/08/2024 5,08 R.240,43 Tesouro IPCA+ com Juros Semestrais 2026 (NTNB) 15/08/2026 5,22 R.246,88 Tesouro IPCA+ com Juros Semestrais 2035 (NTNB) 15/05/2035 5,47 R.221,99 Tesouro IPCA+ com Juros Semestrais 2045 (NTNB) 15/05/2045 5,56 R.231,12 Tesouro IPCA+ com Juros Semestrais 2050 (NTNB) 15/08/2050 5,54 R.298,33 Prefixados Tesouro Prefixado 2018 (LTN) 01/01/2018 7,06 R4,86 Tesouro Prefixado 2019 (LTN) 01/01/2019 7,13 R9,11 Tesouro Prefixado 2020 (LTN) 01/01/2020 8,52 R4,19 Tesouro Prefixado 2021 (LTN) 01/01/2021 9,46 R7,85 Tesouro Prefixado 2023 (LTN) 01/01/2023 10,32 R8,40 Tesouro Prefixado com Juros Semestrais 2021 (NTNF) 01/01/2021 9,28 R.060,17 Tesouro Prefixado com Juros Semestrais 2023 (NTNF) 01/01/2023 10,08 R.039,70 Tesouro Prefixado com Juros Semestrais 2025 (NTNF) 01/01/2025 10,37 R.025,50 Tesouro Prefixado com Juros Semestrais 2027 (NTNF) 01/01/2027 10,48 R.016,60 Indexados à Taxa Selic Tesouro Selic 2021 (LFT) 01/03/2021 0,04 R.226,94 Tesouro Selic 2023 (LFT) 01/03/2023 0,04 R.219,57 Indexados ao IGP-M Tesouro IGPM+ com Juros Semestrais 2021 (NTNC) 01/04/2021 4,42 R.756,86 Tesouro IGPM+ com Juros Semestrais 2031 (NTNC) 01/01/2031 5,33 R.863,43

这是葡萄牙语,所以我会尽力帮助获得帮助:

  1. 不幸的是,一切都在一行中,我相信这是因为 HTML 文件是这样的,grep 得到了它。
  2. 重要数据就在最后一个词 "investir" 和第一个 "Resgatar" 之后。这些是可以从政府购买的债券。
  3. 在最后一个词 "resgatar" 和 table 结尾之间,是不再可供购买的债券,但您可以在到期日之前随时卖回给政府。
  4. table 字段标题是 "Titulo - Vencimento - Taxa de Rendimento (% a.a.) - Preço Unitario",转换为 "Title - Due date - Interst Rate (% year) - Unit Price"

如果你们能帮我至少删除 table 标题之间不需要的 'description words'(也就是说,从行首到第一次出现 "Título" 和然后从第一个 "Resgatar" 到下一个 "Título"),我相信这个工具也可以帮助其他人。

从那里,我可以尝试使用 AWK 来排除文件的其余部分并按照我想要的方式进行格式化。我只需要删除这些,尽管在堆栈中搜索了几个问题,但我无法做到这一点。 此外,如果有人有更聪明的方法来做我打算做的事情,请随意丢弃我所做的一切愚蠢的事情,并在 BASH 中提出更聪明的方法!

非常感谢您。

一个例子:

wget -q -O - 'http://www.tesouro.fazenda.gov.br/tesouro-direto-precos-e-taxas-dos-titulos' |\
  xmlstarlet format --recover --html 2>/dev/null |\
  xmlstarlet select --html --template --value-of "/html/body/div/div/div/div/div/div/div/div/div/div/table/tbody/tr/td[@class='listing0' or @class='listing' or @class='listing ']" |\
  paste -d ";" - - - - - |\
  column -s ";" -t

输出:

Tesouro IPCA+ 2024 (NTNB Princ)                     15/08/2024  5,06   R,60  R.180,09
Tesouro IPCA+ 2035 (NTNB Princ)                     15/05/2035  5,48   R,96  R.198,82
Tesouro IPCA+ 2045 (NTNB Princ)                     15/05/2045  5,48   R,21  R4,20
Tesouro IPCA+ com Juros Semestrais 2026 (NTNB)      15/08/2026  5,10   R,72  R.272,36
Tesouro IPCA+ com Juros Semestrais 2035 (NTNB)      15/05/2035  5,35   R,63  R.263,54
Tesouro IPCA+ com Juros Semestrais 2050 (NTNB)      15/08/2050  5,41   R,60  R.360,49
Tesouro Prefixado 2020 (LTN)                        01/01/2020  8,38   R,85  R6,45
Tesouro Prefixado 2023 (LTN)                        01/01/2023  10,20  R,58  R1,76
Tesouro Prefixado com Juros Semestrais 2027 (NTNF)  01/01/2027  10,37  R,67  R.022,61
Tesouro Selic 2023 (LFT)                            01/03/2023  0,00   R,38  R.238,83

我插入了 xmlstarlet format --recover --html 2>/dev/null 因为 HTML 来自这个 URL 是无效的。


参见:xmlstarlet select --helpman pasteman column