Python数据搜集(使用Xpath) - 返回空列表并删除字符

时间:2016-07-29 05:15:24

标签: python-2.7

-

我试图从网站上搜集信息:

http://www.forexfactory.com/#tradesPositions

现在,我曾经有过这个论坛帮助我开始运行的一个并且正在运行,但我认为网站上的内容已经发生了变化,我不再使用的脚本。

我需要什么?

我想减少“短”的数量。而且' long'澳元兑美元,欧元兑美元,英镑兑美元,美元兑日元,美元兑加元,新西兰元和美元兑瑞郎的头寸。

不是百分比,交易者的实际数量。

enter image description here

我做了什么?

这是针对EURUSD

import lxml.html
from selenium import webdriver

driver = webdriver.Chrome("C:\Users\MY NAME\Downloads\Chrome Driver\chromedriver.exe")
url = ('http://www.forexfactory.com/#tradesPositions')
driver.get(url)


tree = lxml.html.fromstring(driver.page_source)
results_short = tree.xpath('//*[@id="flexBox_flex_trades/positions_tradesPositionsCopy1"]/div[1]/table/tbody/tr/td[2]/div[1]/ul[1]/li[2]/span/text()')
results_long = tree.xpath('//*[@id="flexBox_flex_trades/positions_tradesPositionsCopy1"]/div[1]/table/tbody/tr/td[2]/div[1]/ul[1]/li[1]/span/text()')


print "Forex Factory"
print "Traders Short EURUSD:",results_short
print "Traders Long EURUSD:",results_long
driver.quit()

返回

Forex Factory
Traders Short EURUSD: ['337 Traders ', ' ']
Traders Long EURUSD: [' 259 Traders']

除了数字之外,我想从结果中删除所有内容。我尝试过.strip()和.replace(),但都没有在列表上工作。对于那些我没有想到的人来说,这并不奇怪!

清单

当我将相同的技术应用于AUDUSD时,我得到一个空列表。

import lxml.html
from selenium import webdriver
driver = webdriver.Chrome("C:\Users\Andrew G\Downloads\Chrome Driver\chromedriver.exe")
url = ('http://www.forexfactory.com/#tradesPositions')
driver.get(url)


tree = lxml.html.fromstring(driver.page_source)
results_short = tree.xpath('//*[@id="flexBox_flex_trades/positions_tradesPositionsCopy1"]/div[6]/table/tbody/tr/td[2]/div[1]/ul[1]/li[2]/span/text()')
results_long = tree.xpath('//*[@id="flexBox_flex_trades/positions_tradesPositionsCopy1"]/div[6]/table/tbody/tr/td[2]/div[1]/ul[1]/li[1]/span/text()')

s2 = results_short
l2 = results_long


print "Traders Short AUDUSD:",s2
print "Traders Long AUDUSD:",l2

返回

Traders Short AUDUSD: []
Traders Long AUDUSD: []

是什么给出的? Xpath无法正常工作吗?只需使用Chromes'检查元素'功能并导航到所需的数字,并复制路径。 EURUSD的方法相同。

理想情况下,最好设置一个可以插入tree.xpath的div编号列表,而不是重复所有不同货币的代码行以使其更整洁。所以,在它所拥有的Xpath中:

/div[number]/

最好有一个列表,即[1,2,3,4,5,6]可以插入,因为Xpath的其余部分对于货币是相同的。无论如何,这是一个可选的奖金,优先考虑的是获得所列所有货币的回报。

感谢

1 个答案:

答案 0 :(得分:1)

您可以使用strip方法删除结果中的所有空格,这是我的示例代码:

for index in range(len(results_short)):
    results_short[index] = results_short[index].strip()

    if results_short[index] == "":
        del results_short[index]

for index in range(len(results_long)):
    results_long[index] = results_long[index].strip()

    if results_long[index] == "":
        del results_long[index]

对于该问题,您无法获得AUD的结果,因为在您单击"展开"之前,这些值未加载到页面中。按钮。但我发现您可以从以下页面获得结果:http://www.forexfactory.com/trades.php

因此您可以将url的值更改为:

url = ('http://www.forexfactory.com/trades.php')

对于此页面,由于CSS ID的名称已更改,您需要将值更新为:

results_short = tree.xpath('//*[@id="flexBox_flex_trades/positions_tradesPositions"]/div[6]/table/tbody/tr/td[2]/div[1]/ul[1]/li[2]/span/text()')
results_long = tree.xpath('//*[@id="flexBox_flex_trades/positions_tradesPositions"]/div[6]/table/tbody/tr/td[2]/div[1]/ul[1]/li[1]/span/text()')

然后应用上面提到的条带功能,你应该能够得到正确的结果。