如何抓取 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
这是葡萄牙语,所以我会尽力帮助获得帮助:
- 不幸的是,一切都在一行中,我相信这是因为 HTML 文件是这样的,grep 得到了它。
- 重要数据就在最后一个词 "investir" 和第一个 "Resgatar" 之后。这些是可以从政府购买的债券。
- 在最后一个词 "resgatar" 和 table 结尾之间,是不再可供购买的债券,但您可以在到期日之前随时卖回给政府。
- 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 --help
、man paste
和 man column
我一直试图从这个网站上抓取(使用 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
这是葡萄牙语,所以我会尽力帮助获得帮助:
- 不幸的是,一切都在一行中,我相信这是因为 HTML 文件是这样的,grep 得到了它。
- 重要数据就在最后一个词 "investir" 和第一个 "Resgatar" 之后。这些是可以从政府购买的债券。
- 在最后一个词 "resgatar" 和 table 结尾之间,是不再可供购买的债券,但您可以在到期日之前随时卖回给政府。
- 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 --help
、man paste
和 man column