在 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 ".
  • 之后的数值