我试图用小狗解析一个HTML页面。这是一个命令行HTML解析器,它接受一般的HTML选择器。我知道我可以使用我已经安装在我的机器上的Python,但是我想学习如何使用pup来练习命令行。
我想从https://ucr.fbi.gov/crime-in-the-u.s/2018/crime-in-the-u.s.-2018/topic-pages/tables/table-1上刮走的网站
我创建了一个html文件:
curl https://ucr.fbi.gov/crime-in-the-u.s/2018/crime-in-the-u.s.-2018/topic-pages/tables/table-1 > fbi2018.html如何提取一列数据,如“人口”?
这是我最初写的命令:
cat fbi2018.html | grep -A1 'cell31 ' | grep -v 'cell31 ' | sed 's/text-align: right;//' | sed 's/<[/]td>//' | sed 's/--//' | sed '/^[[:space:]]*$/d' | sort -nk1,1 它确实有效,但这是一种丑陋的,讨厌的方法,这就是为什么我想使用小狗。我注意到,我所需要的列“填充”中的所有值都在headers="cell 31 .."标记中的某个位置。例如:
323,405,935我想提取它的标记中有这个特定标题的所有值,在这个特定的例子中,它将是323,405,935。
然而,似乎小狗中的多个选择器不起作用。到目前为止,我可以选择所有td元素:
cat fbi2018.html | pup 'td'但我不知道如何选择包含特定查询的标题。
编辑:输出应该是:
272,690,813
281,421,906
285,317,559
287,973,924
290,788,976
293,656,842
296,507,061
299,398,484
301,621,157
304,059,724
307,006,550
309,330,219
311,587,816
313,873,685
316,497,531
318,907,401
320,896,618
323,405,935
325,147,121
327,167,434发布于 2020-05-30 05:41:39
如果要在该表的“填充”下使用整列,请使用此方法:
... | pup 'div#table-data-container:nth-of-type(3) td.group1 text{}'pup确实支持多个选择器。例如,如果您想在下面抓取wanted text!!:
$ cat file.html
some text
some other text.
wanted text!!
some other text.
$ cat file.html | pup 'div table tr.class-b td#aaa'
wanted text!!然后添加text{}只获取文本:
$ cat file.html | pup 'div table tr.class-b td#aaa text{}'
wanted text!!所以在你的情况下应该是:
$ cat fbi2018.html | pup 'td#cell211 text{}'
323,405,935或者更好的是,您不必下载页面,只需将curl输送到pup
url="https://ucr.fbi.gov/crime-in-the-u.s/2018/crime-in-the-u.s.-2018/topic-pages/tables/table-1"
curl -s "$url" | pup 'td#cell211 text{}'如果您想要从整个列中获得值,那么您应该知道要抓取的元素的特征。
在这种情况下,“人口”列从给定的链接。在页面上,有两个用
...包装的表,如果使用... | pup 'div#table-data-container',它还会从第二个表中获取数据。你不会想要那样的。

pup怎么知道你想要第一张桌子?还有另一个提示。正如你所看到的,几乎没有
s,你的桌子在第三天。所以您可以使用CSS的psuedo类,在本例中是div#table-data-container:nth-of-type(3)
然后,列有唯一的选择器作为td.group1。

将它们组合在一起,然后将其输送到grep -v -e '^,以消除空白。
... | pup 'div#table-data-container:nth-of-type(3) td.group1 text{}' | grep -v -e '^你会得到你想要的272,690,813
281,421,906
285,317,559
...
327,167,434,以消除空白。
A26
你会得到你想要的
A27
你会得到你想要的
A27,以消除空白。
A26
你会得到你想要的
A27
https://unix.stackexchange.com/questions/589798
复制相似问题