我尝试使用XPath和xidel来解析html页面。该页面有一个包含多行和多列的表,我需要从列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 -看起来很完美时,性能就不是问题了。但不是用可变的循环。我想从每一行接收一对值。现在我只得到部分数据,甚至是空文件。
发布于 2015-03-25 11:19:53
也许这条西德尔线会派上用场:
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,端口).希望这就是你要找的?
发布于 2019-05-26 23:43:58
我需要从列2和5 (IP和端口)中获取每一行的值,并将它们存储在类似csv的文件中。
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]:选择同类的第三个表。你想要的那个。//tr[not(td[@class="vg_table_header"])]:选择除标头以外的所有行。td[2]/span[@style="font-size: 10pt;"]:选择第二列和只包含IP地址的<span>。extract(td[5],"TCP: (\d+)",1):选择第5列,在"TCP "之后提取(regex)数值。https://stackoverflow.com/questions/28929876
复制相似问题