首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在bash循环脚本中将外部变量传递给xidel

在bash循环脚本中将外部变量传递给xidel
EN

Stack Overflow用户
提问于 2015-03-08 17:56:36
回答 2查看 751关注 0票数 0

我尝试使用XPath和xidel来解析html页面。该页面有一个包含多行和多列的表,我需要从列2和5 (IP和端口)中获取每一行的值,并将它们存储在类似csv的文件中。这是我的剧本

代码语言:javascript
复制
#!/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 -看起来很完美时,性能就不是问题了。但不是用可变的循环。我想从每一行接收一对值。现在我只得到部分数据,甚至是空文件。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-25 11:19:53

也许这条西德尔线会派上用场:

代码语言:javascript
复制
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,端口).希望这就是你要找的?

票数 0
EN

Stack Overflow用户

发布于 2019-05-26 23:43:58

我需要从列2和5 (IP和端口)中获取每一行的值,并将它们存储在类似csv的文件中。

代码语言:javascript
复制
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)数值。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28929876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档