在 bash 循环脚本中将外部变量传递给 xidel
Pass external variable to xidel in bash loop script
我尝试使用 XPath 和 xidel 解析 html 页面。
该页面有一个包含多行和多列的 table
我需要从第 2 列和第 5 列(IP 和端口)的每一行获取值并将它们存储在类似 csv 的文件中。
这是我的脚本
#!/bin/bash
for (( i = 2; i <= 100; i++ ))
do
xidel http://www.vpngate.net/en/ -e '//*[@id="vg_hosts_table_id"]/tbody/tr["'$i'"]/td[2]/span[1]' >> "$i".txt #get value from first column
xidel http://www.vpngate.net/en/ -e '//*[@id="vg_hosts_table_id"]/tbody/tr["'$i'"]/td[5]' >> "$i".txt #get value from second column
sed -i ':a;N;$!ba;s/\n/^/g' "$i".txt #replace newline with custom delimiter
sed -i '/\s/d' "$i".txt #remove blanks
cat "$i".txt >> ip_port_list #create list
zip -m ips.zip "$i".txt #archive unneeded texts
done
性能没问题
当我手动增加每个 tr - 看起来很完美。但不适用于循环中的变量。
我想从每一行接收一对值。
现在我只有部分数据甚至是空文件
也许这条 xidel 线会派上用场:
xidel -q http://www.vpngate.net/en/ -e '//*[@id="vg_hosts_table_id"]/tbody/tr[*]/concat(td[2]/span[1],",",substring-after(substring-before(td[5],"UDP:"),"TCP: "))'
这只会执行一次提取(因此 vpngate 的管理员不会阻止您)并且还会创建 CSV 输出(ip、端口)...希望这就是您要找的东西?
I need to get values from each row from columns 2 and 5 (IP and port) and store them in csv-like file.
xidel -s "https://www.vpngate.net/en/" -e '
(//table[@id="vg_hosts_table_id"])[3]//tr[not(td[@class="vg_table_header"])]/concat(
td[2]/span[@style="font-size: 10pt;"],
",",
extract(
td[5],
"TCP: (\d+)",
1
)
)
'
220.218.70.177,443
211.58.36.54,995
1.239.223.190,1351
[...]
153.207.18.229,1542
(//table[@id="vg_hosts_table_id"])[3]
: Select其第3个table
种类。你要的那个。
//tr[not(td[@class="vg_table_header"])]
:Select 所有行,headers. 除外
td[2]/span[@style="font-size: 10pt;"]
:Select 第二列和仅包含 IP-address. 的 <span>
extract(td[5],"TCP: (\d+)",1)
: Select 第 5 列并提取(正则表达式)"TCP "
. 之后的数值
我尝试使用 XPath 和 xidel 解析 html 页面。 该页面有一个包含多行和多列的 table 我需要从第 2 列和第 5 列(IP 和端口)的每一行获取值并将它们存储在类似 csv 的文件中。 这是我的脚本
#!/bin/bash
for (( i = 2; i <= 100; i++ ))
do
xidel http://www.vpngate.net/en/ -e '//*[@id="vg_hosts_table_id"]/tbody/tr["'$i'"]/td[2]/span[1]' >> "$i".txt #get value from first column
xidel http://www.vpngate.net/en/ -e '//*[@id="vg_hosts_table_id"]/tbody/tr["'$i'"]/td[5]' >> "$i".txt #get value from second column
sed -i ':a;N;$!ba;s/\n/^/g' "$i".txt #replace newline with custom delimiter
sed -i '/\s/d' "$i".txt #remove blanks
cat "$i".txt >> ip_port_list #create list
zip -m ips.zip "$i".txt #archive unneeded texts
done
性能没问题 当我手动增加每个 tr - 看起来很完美。但不适用于循环中的变量。 我想从每一行接收一对值。 现在我只有部分数据甚至是空文件
也许这条 xidel 线会派上用场:
xidel -q http://www.vpngate.net/en/ -e '//*[@id="vg_hosts_table_id"]/tbody/tr[*]/concat(td[2]/span[1],",",substring-after(substring-before(td[5],"UDP:"),"TCP: "))'
这只会执行一次提取(因此 vpngate 的管理员不会阻止您)并且还会创建 CSV 输出(ip、端口)...希望这就是您要找的东西?
I need to get values from each row from columns 2 and 5 (IP and port) and store them in csv-like file.
xidel -s "https://www.vpngate.net/en/" -e '
(//table[@id="vg_hosts_table_id"])[3]//tr[not(td[@class="vg_table_header"])]/concat(
td[2]/span[@style="font-size: 10pt;"],
",",
extract(
td[5],
"TCP: (\d+)",
1
)
)
'
220.218.70.177,443
211.58.36.54,995
1.239.223.190,1351
[...]
153.207.18.229,1542
(//table[@id="vg_hosts_table_id"])[3]
: Select其第3个table 种类。你要的那个。//tr[not(td[@class="vg_table_header"])]
:Select 所有行,headers. 除外
td[2]/span[@style="font-size: 10pt;"]
:Select 第二列和仅包含 IP-address. 的 extract(td[5],"TCP: (\d+)",1)
: Select 第 5 列并提取(正则表达式)"TCP "
. 之后的数值
<span>