0

次の Web サイトから会社情報を取得しようとしています。

http://www.theglobeandmail.com/globe-investor/markets/stocks/summary/?q=TT

そこのページ ソースから、次のようなネストされた span ステートメントがあることがわかります。

<li class="clearfix">
<span class="label">Low</span>
<span class="giw-a-t-sc-data">36.39</span>
</li>
<li class="clearfix">
<span class="label">Bid<span class="giw-a-t-sc-bidSize smallsize">x0</span></span>
<span class="giw-a-t-sc-data">36.88</span>
</li>

私が書いたコードは、問題なく (Low, 36.69) を取得します。私はこのフォーラムや、bs4 をブレイクアウトさせようとしている他のフォーラム (Bid, 36.88) を何時間も読んでいます。問題は、スパン タグがネストされているため、Bid が「None」と表示されることです。

私は古い "c" プログラマー (GNU Cygwin) で、この python、Beautifulsoup は初めてです。私はそれが大好きですが、面白くて時間を節約するスクリプトの素晴らしい可能性です。

誰でもこの質問を手伝ってもらえますか?私はそれを十分に提起したことを願っています. 私は間違いなく初心者なので、簡単にしてください。前もって感謝します。

4

2 に答える 2

0

そのため、以前よりもうまく機能していますが、まだいくつかの問題があります。私が今何をしているのかを見ることができるように、完全なスクリプトを投稿しています。問題を調査するために時間と労力を費やしますが、これはいずれにせよ Python と Beautifulsoup をよりよく学ぶのに役立ちます。

"""
This program imports a list of stock ticker symbols from "ca_stocks.txt"
It then goes to the Globe website and gets current company stock data
It then writes this data to a file to a CSV file in the form

index, ticker, date&time, dimension, measure

"""

import urllib2
import csv, os
import datetime 
import re #regular expressions library
import bs4
#from bs4 import BeautifulStoneSoup as bss
#from time import gmtime, strftime
#from lxml import etree
import pyquery

#import dataextract as tde

os.chdir('D:\\02 - \\003 INVESTMENTS\\Yahoo Finance Data')


symbolfile = open('ca_stocks2.txt')
symbolslist = symbolfile.read().split('\n')


def pairs(l,n):
# l = list
# n = number
    return zip(*[l[i::n] for i in range(n)])

def main():
    i=0
    while i<len(symbolslist):
        print symbolslist[i]

        url = urllib2.urlopen("http://www.theglobeandmail.com/globe-investor/markets/stocks/summary/?q=" +symbolslist[i])

        root = bs4.BeautifulSoup(url)
        [span.text for span in root("li.clearfix > span")]
        [(span.text, span.findNextSibling('span').text) for span in root.select("li.clearfix > span.label")]

        dims = [[]] *40
        mess = [[]] *40
        j=0
        for span in root.select("li.clearfix > span.label"):
            #print "%s\t%s" % ( span.text, span.findNextSibling('span').text)
            dims[j] = span.text
            mess[j] = span.findNextSibling('span').text
            j+=1

        nowtime = datetime.datetime.now().isoformat()

        with open('globecdndata.csv','ab') as f:
            fw = csv.writer(f, dialect='excel')
            for s in range(0,37):
                csvRow = s, symbolslist[i], nowtime, dims[s], mess[s]
                print csvRow
                fw.writerow(csvRow)    
        f.close()

        i+=1

if __name__ == "__main__":
    main()        

私はこれが醜いコードであることを知っていますが、ちょっと、私は学んでいます. CSV への出力は次のようになります。

(4, 'TT', '2013-11-09T19:32:32.416000', u'Bidx0', u'36.88')

(5, 'TT', '2013-11-09T19:32:32.416000', u'Askx0', u'36.93')

(6, 'TT', '2013-11-09T19:32:32.416000', u'52週高05/22', u'37.94')

日付「05/22」は、価格が新しい高値または安値に達するたびに変更されます。これは、ディメンション (フィールド) の名前には理想的ではありません。

(7, 'TT', '2013-11-09T19:32:32.416000', u'52週安値06/27', u'29.52')

(35, 'TT', '2013-11-09T19:32:32.416000', u'Top 1000 Ranking:', u'Profit: 28Revenue: 34Assets: 36')

何らかの理由で、これらのディメンション (フィールド) とメジャー (データ) がまとめてまとめられています。うーん...

これはいくつかの問題のリストです。しかし、私が言ったように、私は今これを理解できるはずです. たくさん学びます、ありがとう。彼らが何をしているかを知っている人がいて、何らかの意見を提供してくれるのは素晴らしいことです。

于 2013-11-10T04:43:14.020 に答える
0

Web サイトからデータを取得する場合は、PyQuery ( https://pypi.python.org/pypi/pyquery ) をお勧めします。BeautifulSoup と同じように、高速な XML/HTML 解析のために lxml を使用し、HTML 要素の jQuery のようなセレクターにアクセスできます。

import pyquery
root = pyquery.PyQuery("http://www.theglobeandmail.com/globe-investor/markets/stocks/summary/?q=T-T") # you can also pass the HTML-source, that you want to parse
spanlist = root("li.clearfix > span")
for span in spanlist: print span.text

出力:

Open
36.45
Previous Close
36.28
High
37.36
Low
36.39
Bid
36.88

(出力の最初の 10 行だけですが、要点はわかると思います: 数行、素晴らしい結果です...)

BeautifulSoup4とほぼ同じ

>>> import bs4
>>> text = "<li ..." # HTML-source-code from Question
>>> root = bs4.BeautifulSoup(text)
>>> [ span.text for span in root("li.clearfix > span") ]
[u'Low', u'36.39', u'Bidx0', u'36.88']

そして今、構造化されています:

>>> [ ( span.text, span.findNextSibling('span').text) for span in root.select("li.clearfix > span.label") ]
[(u'Low', u'36.39'), (u'Bidx0', u'36.88')]

別々の列に印刷:

>>> for span in root.select("li.clearfix > span.label"):
>>>    print "%s\t%s" % ( span.text, span.findNextSibling('span').text )
Low 36.39
Bidx0   36.88
于 2013-11-09T21:35:46.727 に答える