如何将网页上的数据,读出来?

xilaianzxsc 2016-02-29 08:02:06
VFP 9.0


现有一个网页 www.smm.cn

此网页有一个表,表头为: "品名、价格、均价、涨跌、日期",

我想将此表,读入DBF中去。

请老师教我一下。谢谢!
...全文
210 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xilaianzxsc 2016-03-13
  • 打赏
  • 举报
回复
和夜猫老师说句实在的,我能看懂的,没有几行. 但我下定决心,把这些,一句一句看明白
xilaianzxsc 2016-03-13
  • 打赏
  • 举报
回复
对夜猫老师,我是佩服得五体投地
xilaianzxsc 2016-03-13
  • 打赏
  • 举报
回复
再次回顾此贴,倍感亲切.
都市夜猫 2016-03-03
  • 打赏
  • 举报
回复
下面是用 webbrowser 来读取数据的方法,因为需要等待 IE 下载并解释页面完毕,所以时间会长很多;但也因此不需要对页面源码做分析工作,可靠性会好些:
cUrl = 'www.smm.cn'

oForm = NewObject('form')
oForm.AddObject('wb1','olecontrol','Shell.Explorer.2')
oForm.wb1.Visible = .t.
oForm.wb1.navigate(cUrl)

Wait window nowait noclear '正在加载网页 ... ' + cUrl
Do while IsNull(oForm.wb1.Document)
	Inkey(0.1)
EndDo
Do while IsNull(oForm.wb1.Document.body)
	Inkey(0.1)
EndDo
Do while IsNull(oForm.wb1.Document.getElementById('tabs-1'))
	Inkey(0.1)
EndDo
Wait clear

Create Cursor ttt (f1 N(3), f2 V(20), f3 V(20), f4 V(20), f5 V(20), f6 V(20))

ot = oForm.wb1.Document.getElementById('tabs-1').firstElementChild.firstElementChild
ii = 0
For each o1 in ot.children
	Append Blank
	Replace next 1 f1 with ii
	jj = 1
	For each o2 in o1.children
		jj = jj + 1
		ff = Textmerge('f<<jj>>')
		If !Empty(Field(ff))
			Replace next 1 (ff) with o2.innerText
		EndIf
	EndFor
	ii = ii + 1
EndFor

Store Null to ot, oForm
Locate
Browse
都市夜猫 2016-03-01
  • 打赏
  • 举报
回复
网页内容处理没有一成不变的方法,所以我一般很少回答这类问题 这个问题用 webbrowser 加载这个页面,然后用 getElementByTag / ID 来处理可能更好一些
都市夜猫 2016-03-01
  • 打赏
  • 举报
回复
找到上面处理时的问题,是源码中这条记录 tag 存在附加的元素,另外,源码 today 标签现在也变成 date 了,修改如下:
Local oHttp, cc, cc1, ii

oHttp = NewObject('Microsoft.XMLHttp')
oHttp.open('GET', 'http://www.smm.cn/', .f.)
oHttp.send()
Do while oHttp.readyState <> 4
Inkey(0.1)
EndDo
cc = '' + oHttp.responseBody
oHttp = Null

cc = StrExtract(cc, '<div class="tl-price" id="tabs-1">','</table>', 1, 4)
Do while !Empty(StrExtract(cc, '<!--', '-->')) && 去掉 html 注释行
cc = Strtran(cc, StrExtract(cc, '<!--', '-->', 1, 4), '')
EndDo
*-- html 源码空格不规范,干脆都去掉, tr 标签不统一补全一下, 以便后续处理
cc = Chrtran(cc, Space(1), '')
cc = Strtran(cc, '<tr>', '<trclass="">')

Create Cursor ttt (no I, name V(20), price V(20), aver V(10), change V(10), date V(10))

For ii = 2 to Occurs('<trclass="', cc)
cc1 = StrExtract(cc, '<trclass="', '</tr>', ii, 4)
Append Blank
Replace next 1 ;
no With ii - 1 ;
, name With trimtags(Strextract(cc1, '<tdclass="name"', '</td>', 1, 4)) ;
, price With trimtags(Strextract(cc1, '<tdclass="price"', '</td>', 1, 4)) ;
, aver With trimtags(Strextract(cc1, '<tdclass="aver"', '</td>', 1, 4)) ;
, change With trimtags(Strextract(cc1, '<tdclass="change"', '</td>', 1, 4)) ;
, date With trimtags(Evl(Strextract(cc1, '<tdclass="date"', '</td>', 1, 4) ;
, Strextract(cc1, '<tdclass="today"', '</td>', 1, 4)))
EndFor
Locate
Browse

Function trimtags(tcDesc as String)
Local ii
For ii = Occurs('<', tcDesc) to 1 step -1
tcDesc = Strtran(tcDesc, StrExtract(tcDesc, '<', '>', ii, 2+4), '')
EndFor
Return tcDesc
EndFunc


xilaianzxsc 2016-03-01
  • 打赏
  • 举报
回复
先向夜猫老师表示感谢 我先一行一行地学习 一会儿来结贴
都市夜猫 2016-03-01
  • 打赏
  • 举报
回复
要求不高的话,自己用 xmlhttp 下载该网页,然后硬提取,大概这样:
Local oHttp, cc, cc1, ii

oHttp = NewObject('Microsoft.XMLHttp')
oHttp.open('GET', 'http://www.smm.cn/', .f.)
oHttp.send()
Do while oHttp.readyState <> 4
Inkey(0.1)
EndDo
cc = '' + oHttp.responseBody
oHttp = Null

cc = StrExtract(cc, '<div class="tl-price" id="tabs-1">','</table>', 1, 4)
Do while !Empty(StrExtract(cc, '<!--', '-->')) && 去掉 html 注释行
cc = Strtran(cc, StrExtract(cc, '<!--', '-->', 1, 4), '')
EndDo
cc = Chrtran(cc, Space(1), '') && 源码空格不规范,干脆全部去掉

Create Cursor ttt (no I, name V(20), price V(20), aver V(10), change V(10), today V(10))

For ii = 2 to Occurs('<tr', cc)
cc1 = StrExtract(cc, '<tr', '</tr>', ii, 4)
Append Blank
Replace next 1 no with ii - 1
Replace next 1 name with trimtags(StrExtract(cc1, '<tdclass="name"', '</td>', 1, 4))
Replace next 1 ;
price with StrExtract(cc1, '<tdclass="price">', '</td>', 1) ;
, aver with StrExtract(cc1, '<tdclass="aver">', '</td>', 1) ;
, change with StrExtract(cc1, '<tdclass="change">', '</td>', 1) ;
, today with StrExtract(cc1, '<tdclass="today">', '</td>', 1)
EndFor
Locate
Browse

Function trimtags(tcDesc as String)
Local ii
For ii = Occurs('<', tcDesc) to 1 step -1
tcDesc = Strtran(tcDesc, StrExtract(tcDesc, '<', '>', ii, 2+4), '')
EndFor
Return tcDesc
EndFunc

代码在处理【洋山铜溢价】这条记录时始终有问题,找了半天没找出问题来,只好先放下到这里

2,723

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧