我想从curl输出中获取列表ip:port
curl https://www.gametracker.com/search/?sort=5&order=ASC
我无法发布整个输出,因为它非常大,只需发布我们需要提取 IP:PORT 的部分
<a href="/search/?sort=4&order=ASC">Loc</a>
</td>
<td class="col_h">
<a href="/search/?sort=5&order=DESC">IP:Port</a>▼
</td>
<td class="col_h">
<a href="/search/?sort=6&order=ASC">Server Map</a>
</td>
</tr>
<tr>
<td>
20.
</td>
<td>
<a href="/search/swat4/">
<img src="/images/game_icons16/swat4.png" alt="SWAT4"/>
</a>
</td>
<td>
<a href="/server_info/1.12.237.104:10520/">
tejingduiba FR0.67 TEST
</a>
</td>
<td>
0/16
</td>
<td>
</td>
<td>
<a href="/search/_all/CN/">
<img src="/images/flags/cn.gif" alt="" class="item_16x11"/>
</a>
</td>
<td>
<span class="ip">1.12.237.104</span><span class="port">:10520</span>
</td>
<td>
Red Library Offices
我只需要提取所有这些值,1.12.237.104:10520
就像IP:PORT
如何使用 awk、grep 或任何其他方法来完成此操作?
答案1
任务是获取所有具有属性和 的span
节点对的值。它们在 HTML 中的节点下成对出现。class
ip
port
td
第一个问题是输出curl
不是干净的 XML。这可以通过使用以下方法将 HTML 重新转换为 XML 来解决xmlstarlet
:
curl --silent 'URL' | xmlstarlet format --html
通过 XML 文档,我们现在可以找到td
我们感兴趣的所有节点。这些节点具有属性为 的td
子span
节点(我们假设还有另一个属性为 的兄弟节点)。对于每个这样的节点,我们连接该节点的子节点的值。class
ip
span
class
port
td
span
curl --silent 'URL' | xmlstarlet format --html |
xmlstarlet select --template \
--match '//_:td[_:span[@class="ip"]]' \
--value-of 'concat(_:span[@class="ip"], _:span[@class="port"])' -nl
每个节点名称之前看起来很时髦_:
是由于文档使用了默认命名空间。
给定游戏服务器的当前状态,输出
1.12.237.104:10520
1.14.139.78:14567
1.15.235.182:27102
1.117.83.171:27025
1.117.83.171:27026
2.56.96.145:27960
2.56.99.56:9987
2.56.213.77:27015
2.204.29.39:27015
2.204.29.39:27016
3.0.10.0:28960
3.0.242.157:28960
3.6.230.224:27015
3.17.155.136:19274
3.28.115.189:27015
答案2
和珀尔:
#!/usr/bin/env perl
use strict; use warnings;
use WWW::Mechanize;
use HTML::TreeBuilder::XPath;
use feature qw/say/;
my $m = WWW::Mechanize->new(
autocheck => 0,
quiet => 1,
);
$m->agent_alias("Linux Mozilla");
$m->get("https://www.gametracker.com/search/?sort=5&order=ASC");
my $tree = HTML::TreeBuilder::XPath->new_from_content( $m->content );
my @arr = $tree->findvalues( '//td/span[@class="ip"]/text() | //td/span[@class="port"]/text()' );
for (my $i=0; $i<$#arr; $i+=2) {
say $arr[$i] . $arr[$i+1];
}
输出
1.12.237.104:10520
1.14.139.78:14567
1.15.235.182:27102
1.117.83.171:27025
1.117.83.171:27026
2.56.96.145:27960
2.56.99.56:9987
2.56.213.77:27015
2.204.29.39:27015
2.204.29.39:27016
3.0.10.0:28960
3.0.242.157:28960
3.6.230.224:27015
3.17.155.136:19274
3.28.115.189:27015