Python 网页抓取:试图控制输出
Python Web Scraping: trying to control the output
团队,
我在抓取此网页时难以获得所需的输出:
这是我的:
import urllib2
from html2text import html2text
for line in html2text(urllib2.urlopen("http://www.forexfactory.com/explorerapi.php?content=positions&do=positions_graph_data&limit=&interval=M5&¤cy=AUDUSD").read()).split(','):
if "traders_short"in line:
print "Traders Short AUDUSD: ", line.split(":")[1].strip(' " ')
if "traders_long" in line:
print "Traders Long AUDUSD: ", line.split(":")[1].strip(' " ')
这是我的输出:
Traders Short AUDUSD:
"114
Traders Long AUDUSD: 88
Traders Long AUDUSD: 88
这是我想要的:
Traders Short AUDUSD: number
Traders Long AUDUSD: number
所以问题是:
A) 输出重复,我只希望它告诉我有多少交易者做空或做多一次。
B) 我无法去掉输出第二行中的“”,我希望它像下一行一样位于“:”旁边。
现在这里有更多信息,这是使用 html2text 整理后的页面外观:
{"total":"355468"
"positions":[{"timeframe":"M5"
"dateline":79500
"currency_co
de":"AUDUSD"
"short_lots":"22.405234"
"long_lots":"5.1432014"
"traders_short":
"113"
"traders_long":"88"
"weekend":false
"hidden":false
"pos":1
"datetime":{"
year":"1970"
"month":0
"date":"01"
"hour":"22"
"minute":"05"
"estOffset":5}
"l
ots_ratio":18.669667897002
"traders_ratio":43.781094527363
"dummy_lots":-81.33
0332102998
"dummy_traders":-56.218905472637}
{"timeframe":"M5"
"dateline":7980
0
"currency_code":"AUDUSD"
"short_lots":"22.405234"
"long_lots":"5.1432014"
"t
raders_short":"113"
"traders_long":"88"
"weekend":false
"hidden":true
"pos":2
"datetime":1
"lots_ratio":18.669667897002
"traders_ratio":43.781094527363
"dum
my_lots":-81.330332102998
"dummy_traders":-56.218905472637}]
"data_count":1
"h
as_more":true
"interval":"M5"
"currency":"AUDUSD"
"limit":0}
现在显然 'traders short / long' 出现 不止一次 这就是它打印两次的原因。 但我需要它只打印一次。
如果能从本论坛的专业知识中获得任何帮助,那就太好了!
谢谢。
正如评论中正确建议的那样,数据是一个 JSON 对象。
因此,与其抓取它,不如尝试使用 json
模块和 urllib.request
(python3).
import urllib.request
import json
def get_json(url)
response = urllib.request.urlopen(url)
js = json.loads(response.read().decode('utf-8'))
return js
返回的值是一个简单的 python 字典,您可以像通常使用 dict
.
一样调用键
我会使用 requests
因为它很方便,例如它有一个内置的 json()
方法。您还可以轻松地将那么长的 URL 解压缩到一个更具可读性的查询字典中,然后将其与基本的 URL.
一起传递
我会这样做:
import requests
base_url = "http://www.forexfactory.com/explorerapi.php"
query = {'content': 'positions',
'do': 'positions_graph_data',
'limit': '',
'interval': 'M5',
'currency': 'AUDUSD'}
r = requests.get(base_url, query)
template = "Traders Short {currency_code}: {traders_short}\n"
template += "Traders Long {currency_code}: {traders_long}\n"
for position in r.json()['positions']:
if not position['hidden']:
print(template.format(**position))
重要的是,r.json()
只是一本字典。我选择隐藏 'hidden'
结果,这些结果似乎是重复的,但是此时您当然可以进行任何您喜欢的处理。结果是:
Traders Short AUDUSD: 116
Traders Long AUDUSD: 88
团队,
我在抓取此网页时难以获得所需的输出:
这是我的:
import urllib2
from html2text import html2text
for line in html2text(urllib2.urlopen("http://www.forexfactory.com/explorerapi.php?content=positions&do=positions_graph_data&limit=&interval=M5&¤cy=AUDUSD").read()).split(','):
if "traders_short"in line:
print "Traders Short AUDUSD: ", line.split(":")[1].strip(' " ')
if "traders_long" in line:
print "Traders Long AUDUSD: ", line.split(":")[1].strip(' " ')
这是我的输出:
Traders Short AUDUSD:
"114
Traders Long AUDUSD: 88
Traders Long AUDUSD: 88
这是我想要的:
Traders Short AUDUSD: number
Traders Long AUDUSD: number
所以问题是:
A) 输出重复,我只希望它告诉我有多少交易者做空或做多一次。
B) 我无法去掉输出第二行中的“”,我希望它像下一行一样位于“:”旁边。
现在这里有更多信息,这是使用 html2text 整理后的页面外观:
{"total":"355468"
"positions":[{"timeframe":"M5"
"dateline":79500
"currency_co
de":"AUDUSD"
"short_lots":"22.405234"
"long_lots":"5.1432014"
"traders_short":
"113"
"traders_long":"88"
"weekend":false
"hidden":false
"pos":1
"datetime":{"
year":"1970"
"month":0
"date":"01"
"hour":"22"
"minute":"05"
"estOffset":5}
"l
ots_ratio":18.669667897002
"traders_ratio":43.781094527363
"dummy_lots":-81.33
0332102998
"dummy_traders":-56.218905472637}
{"timeframe":"M5"
"dateline":7980
0
"currency_code":"AUDUSD"
"short_lots":"22.405234"
"long_lots":"5.1432014"
"t
raders_short":"113"
"traders_long":"88"
"weekend":false
"hidden":true
"pos":2
"datetime":1
"lots_ratio":18.669667897002
"traders_ratio":43.781094527363
"dum
my_lots":-81.330332102998
"dummy_traders":-56.218905472637}]
"data_count":1
"h
as_more":true
"interval":"M5"
"currency":"AUDUSD"
"limit":0}
现在显然 'traders short / long' 出现 不止一次 这就是它打印两次的原因。 但我需要它只打印一次。
如果能从本论坛的专业知识中获得任何帮助,那就太好了!
谢谢。
正如评论中正确建议的那样,数据是一个 JSON 对象。
因此,与其抓取它,不如尝试使用 json
模块和 urllib.request
(python3).
import urllib.request
import json
def get_json(url)
response = urllib.request.urlopen(url)
js = json.loads(response.read().decode('utf-8'))
return js
返回的值是一个简单的 python 字典,您可以像通常使用 dict
.
我会使用 requests
因为它很方便,例如它有一个内置的 json()
方法。您还可以轻松地将那么长的 URL 解压缩到一个更具可读性的查询字典中,然后将其与基本的 URL.
我会这样做:
import requests
base_url = "http://www.forexfactory.com/explorerapi.php"
query = {'content': 'positions',
'do': 'positions_graph_data',
'limit': '',
'interval': 'M5',
'currency': 'AUDUSD'}
r = requests.get(base_url, query)
template = "Traders Short {currency_code}: {traders_short}\n"
template += "Traders Long {currency_code}: {traders_long}\n"
for position in r.json()['positions']:
if not position['hidden']:
print(template.format(**position))
重要的是,r.json()
只是一本字典。我选择隐藏 'hidden'
结果,这些结果似乎是重复的,但是此时您当然可以进行任何您喜欢的处理。结果是:
Traders Short AUDUSD: 116
Traders Long AUDUSD: 88