如何从 bash 中的文件中的多个文本中提取一些数字文本?

问题描述 投票:0回答:2

我想使用bash抓取.mhtml文件,本来我只使用curl+xidel来抓取html文件,但现在网络有“东西”阻止我抓取。

这是部分内容:

QuoteStrip-watchLiveLink">LIVE<img src=3D"https://static-redesign.cnbcfm.co=
m/dist/4db8932b7ac3e84e3f64.svg" alt=3D"Watch live logo" class=3D"QuoteStri=
p-watchLiveLogo"></a><a href=3D"https://www.cnbc.com/live-tv/" style=3D"col=
or: rgb(0, 47, 108);">SHARK TANK</a></div></div></div><div class=3D"QuoteSt=
rip-quoteStripSubHeader"><span>RT Quote</span><span> | <!-- -->Exchange</sp=
an><span> | <!-- -->USD</span></div><div class=3D"QuoteStrip-dataContainer"=
><div class=3D"QuoteStrip-lastTimeAndPriceContainer"><div class=3D"QuoteStr=
ip-lastTradeTime">Last | 11:46 PM EDT</div><div class=3D"QuoteStrip-lastPri=
ceStripContainer"><span class=3D"QuoteStrip-lastPrice">1,621.41</span><span=
 class=3D"QuoteStrip-changeDown"><img class=3D"QuoteStrip-changeIcon" src=
=3D"https://static-redesign.cnbcfm.com/dist/4ee243ff052e81044388.svg" alt=
=3D"quote price arrow down"><span>-6.2537</span><span> (<!-- -->-0.3842%<!-=
- -->)</span></span></div></div></div></div><div class=3D"PhoenixChartWrapp=

问题: 我怎样才能在 bash 中只得到

1,621.41
作为输出?

我的常规计划:

#!/bin/bash
curl -s -o ~/Desktop/xau.html -- https://www.cnbc.com/quotes/XAU=
gold=$(xidel -se /html/body/div[2]/div/div[1]/div[3]/div/div[2]/div[1]/div[2]/div[3]/div/div[2]/span[1] ~/Desktop/xau.html | sed 's/\,//g')
echo $gold
exit 0

输出:一些数字

bash macos web-scraping mhtml xidel
2个回答
1
投票

我只使用curl+xidel来抓取html文件

xidel
可以打开网址没问题,所以不需要
curl

/html/body/div[2]/div/div[1]/div[3]/div/div[2]/div[1]/div[2]/div[3]/div/div[2]/span[1]
                                            ^

这个特定的 div 不存在。只有一个。所以这应该有效:

$ xidel -s "https://www.cnbc.com/quotes/XAU=" -e '
  /html/body/div[2]/div/div[1]/div[3]/div/div/div[1]/div[2]/div[3]/div/div[2]/span[1]
'

另外请务必引用提取查询。这将防止出现必须转义大量字符的情况。

网站的 HTML 源代码已缩小。为了更好地了解所有 HTML 元素节点,我建议您再次美化源代码:

$ xidel -s "https://www.cnbc.com/quotes/XAU=" -e . \
  --output-format=html --output-node-indent > ~/Desktop/xau.html

这样你就可以看到查询可以简化为:

$ xidel -s "https://www.cnbc.com/quotes/XAU=" -e '
  //span[@class="QuoteStrip-lastPrice"]
'

或者从

<head>
节点中的 JSON 之一:

$ xidel -s "https://www.cnbc.com/quotes/XAU=" -e '
  parse-json(//script[@type="application/ld+json"][2])/price
'

0
投票

一个困难是线路到处都断了(

=\n
)。首先连接线条,然后提取您要查找的内容:

$ sed -En ':a
s/=\n//g;s!.*<span class=3D"QuoteStrip-lastPrice">([^<]*)</span>.*!\1!p;tb
N;ba
:b
> q' file
1,621.41

或者,使用 GNU

sed
及其
-z
选项:

$ sed -Ez 's!=\n!!g;s!.*<span class=3D"QuoteStrip-lastPrice">([^<]*)</span>.*!\1!' file
1,621.41
© www.soinside.com 2019 - 2024. All rights reserved.