我正试图从以下网站提取公司信息:
http://www.theglobeandmail.com/globe-investor/markets/stocks/summary/?q=T-T
我从页面源看到有嵌套的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>
我写的代码会毫无问题地抓住(低,36.69)。我花了好几个小时阅读这个论坛,其他人试图让bs4也爆发(Bid,36.88)。问题是,由于嵌套的span标签,Bid出现为“无”。
我是一个老“c”程序员(GNU Cygwin)和这个python,Beautifulsoup的东西对我来说是新的。我喜欢它,有趣和节省时间的脚本的巨大潜力。
任何人都可以帮助解决这个问题,我希望我能够提出这个问题。 请保持简单,因为我绝对是新手。 提前谢谢。
答案 0 :(得分:0)
如果您想从网站获取数据,我建议使用PyQuery(https://pypi.python.org/pypi/pyquery)。就像BeautifulSoup一样,它使用lxml进行快速XML / HTML解析,你可以访问类似jQuery的HTML元素选择器。
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
(只是输出的前十行,但我认为你明白我的观点:几行,效果很好......)
>>> 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
答案 1 :(得分: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,'T-T','2013-11-09T19:32:32.416000',u'Bidx0',u'36.88')
(5,'T-T','2013-11-09T19:32:32.416000',u'Askx0',u'36.93')
(6,'T-T','2013-11-09T19:32:32.416000',u'52-week High05 / 22''u'37.94')
每次价格突破到新的高点或低点时,日期“05/22”都会改变。这对于维度(字段)的名称来说并不理想。
(7,'T-T','2013-11-09T19:32:32.416000',u'52-week Low06 / 27',u'29.52')
(35,'T-T','2013-11-09T19:32:32.416000',u'Top 1000排名:',u'Profit:28收入:34位:36')
出于某种原因,它将这些维度(字段)和度量(数据)集中在一起。嗯...
这是一些问题的清单。但是,就像我说的那样,我现在应该能够解决这个问题。学到很多,谢谢。有人知道他们在做什么,提供一些输入是很棒的。