-1

我目前正在开发一个从股票网站提取信息的 python 程序

http://markets.usatoday.com/custom/usatoday-com/html-mktscreener.asp

我需要提取所有列 Symbol - Volume。在这个程序之前,我必须创建一个 bash 脚本,每分钟下载一次页面,持续 1 小时,以获得 60 个页面。我已经做到了。但我不明白如何提取信息,所以我可以将该信息注入 MySQL db。

import libxml2
import sys
import os
import commands
import re
import sys

import MySQLdb

from xml.dom.minidom import parse, parseString

# for converting dict to xml 
from cStringIO import StringIO
from xml.parsers import expat

def get_elms_for_atr_val(tag,atr,val):
   lst=[]
   elms = dom.getElementsByTagName(tag)
   # ............

   return lst

# get all text recursively to the bottom
def get_text(e):
   lst=[]
   # ............
   return lst
def extract_values(dm):
   lst = []
   l = get_elms_for_atr_val('table','class','most_actives')
   # ............
   #    get_text(e)
   # ............
   return lst

我对 python 很陌生,这是最好的。下载了 60 个 HTML 页面,我需要做的只是从我相信的 1 个页面中提取信息 或者至少如果我可以从 1 个页面开始,我可以为其他页面找出一个循环,并提取要使用的信息在 MYSQL

任何让我开始的帮助表示赞赏!

4

1 回答 1

0

使用健壮的 HTML 解析器而不是xml模块,因为后者将拒绝格式错误的文档,就像您指向的 URL 看起来一样。这是一个快速的解决方案:

from lxml.html import parse
import sys

def process(htmlpage):
    tree = parse(htmlpage).getroot()

    # Helper function
    xpath_to_column = lambda expr: [el.text for el in tree.xpath(expr)]

    symbol = xpath_to_column('//*[@id="idcquoteholder"]/table/tr/td[1]/a')
    price  = xpath_to_column('//*[@id="idcquoteholder"]/table/tr/td[3]')
    volume = xpath_to_column('//*[@id="idcquoteholder"]/table/tr/td[6]')

    return zip(symbol, price, volume)


def main():
    for filename in sys.argv[1:]:
        with open(filename, 'r') as page:
            print process(page)


if __name__ == '__main__':
    main()

您将不得不对这个示例进行一些详细说明,因为某些元素(如“符号”)进一步包含在spanora节点中,但精神是:使用 XPath 查询和提取列内容。根据需要添加列。

提示:使用 Chrome Inspector 或 Firebug 获取正确的 XPath。

编辑:将命令行上的所有文件名传递给这个脚本。如果您需要单独处理每个文件,请for删除main().

于 2013-05-05T20:49:05.733 回答