1

的输出"curl -s http://122.160.230.125:8080/gbod/gb_on_demand.do | head -115 | tail -3"给出以下

<li>Balance quota:&nbsp;&nbsp;&nbsp;78.26&nbsp;GB</li>
<li>High speed data limit:&nbsp;&nbsp;&nbsp;80.0&nbsp;GB</li>
<li>No. of days left in the current bill cycle:&nbsp;&nbsp;&nbsp;28</li>

curl -s http://122.160.230.125:8080/gbod/gb_on_demand.do | head -115 | tail -3 | awk '{gsub (/&nbsp;/, " "); gsub (/\<li>/, ""); gsub (/\<\/li>/, " "); print}'给出

Balance quota:   78.26 GB
High speed data limit:   80.0 GB
No. of days left in the current bill cycle:   28

如何仅从每行中提取数字数据?另外,有没有更好的方法来提取这些数据?

4

5 回答 5

1

一种方法:

curl -s http://122.160.230.125:8080/gbod/gb_on_demand.do | awk -F"[;&<]" 'NR>115-3 && NR<=115 {print $8}'
78.26
80.0
28

PS,如果您发布我们的输出,curl -s http://122.160.230.125:8080/gbod/gb_on_demand.do我们肯定可以清理更多。

于 2013-11-12T07:40:54.577 回答
1

如果你想要一些不那么脆弱的东西,而不是依赖于你想要的行恰好在第 113-115 行,这里有一些 Python 代码使用BeautifulSoup更好地完成同样的事情。

在不知道你的源文件是什么样子的情况下,我不得不做出很多假设。特别是,我假设您想从文件中的每个 <li>标签中提取数字。如果您只想从具有数字的<li>标签中提取数字,或者仅从具有良好属性<li>的特定标签下的标签中提取数字,或者通过一些简单的路径从根目录访问,或者其他什么,代码会有所不同。<ul>id

import re
import urllib.request
import bs4

url = 'http://122.160.230.125:8080/gbod/gb_on_demand.do'
page = urllib.request.urlopen(url).read()
soup = bs4.beautifulSoup(page)
for li in soup.find_all('li'):
    print re.search('\d[\d.]+', li.text).group()
于 2013-11-12T05:48:09.633 回答
1

假设响应是正确的 XML,您可以使用xmlstarlet来获取元素的内容<li>

http://xmlstar.sourceforge.net/doc/UG/xmlstarlet-ug.html#d0e270

您将不得不了解如何定义查询,但恕我直言,这是值得的,因为您可能会发现您获得的知识对未来的 xml/html 查询很有帮助。

有一些浏览器插件可以帮助您定义所需的 css 选择器,以准确选择所需的 li-items(而不是假设它们总是出现在同一行上)。不幸的是,我现在找不到参考资料。

从那里开始,按照其他建议使用 grep 或 sed 或 awk。

于 2013-11-12T08:06:38.737 回答
1

使用行数和正则表达式来解析 HTML 非常笨拙且非常脆弱。

但是,如果您想扩展您已经在做的事情,那么该死的鲁棒性,您所需要的只是一个简单的正则表达式来匹配数字:

curl -s http://122.160.230.125:8080/gbod/gb_on_demand.do | 
    head -115 | tail -3 | 
    awk '{gsub (/&nbsp;/, " "); gsub (/\<li>/, ""); gsub (/\<\/li>/, " "); print} |
    grep -o -E -e '[0-9][0-9.]+'

(我永远不记得我是否拥有适用于所有 grep 变体的标志。这绝对适用于 BSD grep;如果它不适用于您的,则标志将-o仅打印匹配项而不是整行,-E使用扩展的正则表达式而不是基本的,当然-e还要指定模式。)

于 2013-11-12T05:39:45.553 回答
0

正如建议的那样,我尝试了以下方法,得到了我想要的东西。

import urllib2
import re
from bs4 import BeautifulSoup
url = 'http://122.160.230.125:8080/gbod/gb_on_demand.do'
page = urllib2.urlopen(url).read()
soup = BeautifulSoup(page)
data = []
for li in soup.find_all('li', limit=4):
        somevar =  re.search('\d[\d.]+', li.text).group();
        data.append(somevar)

print "DSL Number: ", data[0]
print "Balance: ", data[1], "GB"
print "Limit: ", data[2], "GB"
print "Days Left: ", data[3]

对于我的项目,使用这个 python 脚本比使用 curl 更有意义。

谢谢大家的帮助。

于 2013-11-14T14:45:27.750 回答