Foxtable(狐表)用户栏目专家坐堂 → 有条件下载网页数据


  共有3669人关注过本帖树形打印复制链接

主题:有条件下载网页数据

帅哥哟,离线,有人找我吗?
cxmxjwlmq
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:349 积分:4070 威望:0 精华:0 注册:2018/4/6 18:02:00
有条件下载网页数据  发帖心情 Post By:2020/12/17 0:12:00 [只看该作者]

各位老师:下面的代码可以正常下载网页的全部数据,但实际中我想带条件下载部分数据,就是下面标红的条件。实在汗颜,怎样也把这个条件加不到代码中并正确执行!

。。。。。

Dim dr As Row
For n1 As Integer = 1 To elems.count - 1             '把网页中的第一列取掉,要不然有一行是空值
    Dim tds = elems(n1).getelementsbytagname("td")    '在网页中查找td(第行中每列的数据)
      ' Like "LJ222009"  就是在网页中,查找elems(4) like "LJ222009"行
    dr = Tables("装配部件临时表").AddNew()
    For tn As Integer = 0 To tds.count -1
        If dict.ContainsKey(tn) Then                 '如果临时表表头的列名
           dr(dict(tn)) = tds(tn).InnerText          '以临时表表头列名来引用数据
        End If
    Next
Next

。。。。

 

下面这是部分网页分析的代码:

。。。。

<TH scope=col>序号</TH>
<TH scope=col><A href="javascript:__doPostBack('ctl00$C$gv','Sort$CPBH')">车型编号</A></TH>
<TH scope=col><A href="javascript:__doPostBack('ctl00$C$gv','Sort$WLBH')">物料编号</A></TH>
<TH scope=col><A href="javascript:__doPostBack('ctl00$C$gv','Sort$FDJH')">发动机号</A></TH>

<TH scope=col><A href="javascript:__doPostBack('ctl00$C$gv','Sort$DPH')">底盘号</A></TH>

<TH scope=col><A href="javascript:__doPostBack('ctl00$C$gv','Sort$LBJH')">零部件号</A></TH>
<TH scope=col><A href="javascript:__doPostBack('ctl00$C$gv','Sort$LJMC')">零件名称</A></TH>
<TH scope=col><A href="javascript:__doPostBack('ctl00$C$gv','Sort$GHDW')">供货单位</A></TH>
<TH scope=col><A href="javascript:__doPostBack('ctl00$C$gv','Sort$LJSCRQ')">零件生产日期</A></TH>
<TH scope=col><A href="javascript:__doPostBack('ctl00$C$gv','Sort$CGDD')">零件批次号</A></TH>
<TH scope=col><A href="javascript:__doPostBack('ctl00$C$gv','Sort$LJSL')">零件数量</A></TH>
<TH style="WIDTH: 30px" vAlign=middle scope=col align=center>查看</TH></TR>

<TR align=center>
<TD align=center><INPUT id=ctl00_C_gv_ctl02_cb type=checkbox name=ctl00$C$gv$ctl02$cb> </TD>

<TD style="WIDTH: 50px">1 </TD>

<TD>DFV4258GP6C-T54KF-J5-C08AY</TD>

<TD>000000000013100754</TD>

<TD>13N8DFL30010</TD>

<TD>LJ222009</TD>

<TD>C1141010-8260DNY</TD>
<TD>CNG气柜合件总成</TD>
<TD>XIE10</TD>
<TD>201021</TD>
<TD>20102100669</TD>

 

。。。。。

 

请各位老师及大咖们指教!

请费心!

谢谢!

[此贴子已经被作者于2020/12/17 0:12:59编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110334 积分:561518 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/12/17 8:54:00 [只看该作者]

    For tn As Integer = 0 To tds.count -1
if tds(tn).InnerText  = "LJ222009" then
msgbox(tds(tn).InnerText )
end if
        If dict.ContainsKey(tn) Then                 '如果临时表表头的列名
           dr(dict(tn)) = tds(tn).InnerText          '以临时表表头列名来引用数据
        End If
    Next 

 回到顶部
帅哥哟,离线,有人找我吗?
cxmxjwlmq
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:349 积分:4070 威望:0 精华:0 注册:2018/4/6 18:02:00
  发帖心情 Post By:2020/12/17 10:58:00 [只看该作者]

谢谢蓝老师!

按照蓝老师的指教,我修改了代码,但只下载了一列的数据!

 如下图:


图片点击可在新窗口打开查看此主题相关图片如下:微信图片_20201217105211.png
图片点击可在新窗口打开查看

 

我没有说清楚,我想要的效果是下载符合条件列的所有行、所有列的数据!
如下图:

 


图片点击可在新窗口打开查看此主题相关图片如下:微信图片_20201217105610.png
图片点击可在新窗口打开查看

 

请老师费心!

谢谢!


 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110334 积分:561518 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/12/17 11:26:00 [只看该作者]

那没有必要判断啊,去掉2楼的判断

 回到顶部
帅哥哟,离线,有人找我吗?
cxmxjwlmq
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:349 积分:4070 威望:0 精华:0 注册:2018/4/6 18:02:00
  发帖心情 Post By:2020/12/17 11:58:00 [只看该作者]

蓝老师:网页的表中有很多数据,如下图:

 


图片点击可在新窗口打开查看此主题相关图片如下:微信图片_20201217115455.png
图片点击可在新窗口打开查看

 

在程序中,我想要根据用户选的底盘号不同,下载用户选定底盘号的行下载!

 

谢谢,费心了!


 回到顶部
帅哥,在线噢!
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110334 积分:561518 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/12/17 12:06:00 [只看该作者]

1楼给的代码和页面数据太少,无法判断

 回到顶部
帅哥哟,离线,有人找我吗?
cxmxjwlmq
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:349 积分:4070 威望:0 精华:0 注册:2018/4/6 18:02:00
  发帖心情 Post By:2020/12/17 12:19:00 [只看该作者]

蓝老师:全部的代码如下:

Dim txt As  String
If  Char.IsUpper(Left((Right(e.Form.Controls("TextBox1").Text,8)),1)) Then  '如果第一位是字符
     txt = (Right(e.Form.Controls("TextBox1").Text,8))
Else
   If  Char.IsDigit(Left(e.Form.Controls("TextBox1").Text,1)) Then  '如果第一位是字符
     txt = "%" & (Right(e.Form.Controls("TextBox1").Text,6))  ''如果手输入时,只有6位纯数字,前面加通配符%,补够8位的底盘号
   End If
End  If
 DataTables("总成条码扫描_Table1").LoadFilter = "底盘号 Like '" & txt & "' And 序号 = 0 "  'SQL加载条件
 DataTables("总成条码扫描_Table1").Load()
    e.Form.Controls("Button5").Select
'   e.Form.Controls("TextBox4").Select
Dim n As Integer = Tables("总成条码扫描_Table1").Rows.Count
If n = 1 
   Dim cr = Tables("总成条码扫描_Table1").Current
       e.Form.Controls("TextBox3").Text = cr("代号")'
   Dim txt1  As  String = e.Form.Controls("TextBox3").Text
       DataTables("总成条码扫描_Table2").LoadFilter = "适用车型 Like '" & txt1 & "' "  'SQL加载条件
       DataTables("总成条码扫描_Table2").Load()                 '加载符合条件的数据 
   If cr("C1000020_判定") = True
      e.Form.Controls("Button2").Enabled = True  '打印下线码
   Else
      e.Form.Controls("Button2").Enabled = False
   End If
   If cr("C8406910_判定") = True
      e.Form.Controls("Button1").Enabled = True  '打印总成表
   Else
      e.Form.Controls("Button1").Enabled = False
   End If
ElseIf n = 0
   DataTables("总成条码扫描_Table2").LoadFilter = "序号 = 1 "  'SQL加载条件
   DataTables("总成条码扫描_Table2").Load()                 '加载符合条件的数据 
End If


Dim web As System.Windows.Forms.WebBrowser = e.Form.controls("webbrowser2").basecontrol
           web.Navigate("......")
          Do Until web.ReadyState = 4
             Application.DoEvents
          Loop
Do Until web.ReadyState = 4 AndAlso web.Document.GetElementById("ctl00_C_gv") IsNot Nothing
    Application.DoEvents
Loop
Dim elems As object = web.Document.GetElementsByTagName("div")
    elems = web.Document.GetElementById("ctl00_C_gv").GetElementsByTagName("th") '在网页中查找th(有多少列)
Dim dtb As New DataTableBuilder("装配部件临时表")                 '定义一个临时表
Dim dict As new Dictionary(of Integer,String)              '定义一个临时表表头数组
For i As Integer = 0 To elems.count-1
    If elems(i).InnerText > "" Then
       dict.add(i,elems(i).InnerText)                       '确定临时表表头的列名
       dtb.AddDef(elems(i).InnerText,Gettype(String),250)   '依据网页表头,生成临时表表头
    End If
Next
dtb.Build()
'MainTable = Tables("临时表")   '如果加上的话,这个表就会显现,遮盖窗口表单
elems = web.Document.GetElementById("ctl00_C_gv").GetElementsByTagName("tr")  '在网页中查找tr(有多少行数据)
Dim dr As Row
For n1 As Integer = 1 To elems.count - 1             '把网页中的第一列取掉,要不然有一行是空值
    Dim tds = elems(n1).getelementsbytagname("td")    '在网页中查找td(第行中每列的数据)


    dr = Tables("装配部件临时表").AddNew()
    For tn As Integer = 0 To tds.count -1

If tds(tn).InnerText  = "LJ222009" Then  '到时替换成变量:txt
msgbox(tds(tn).InnerText )


        If dict.ContainsKey(tn) Then                 '如果临时表表头的列名
           dr(dict(tn)) = tds(tn).InnerText          '以临时表表头列名来引用数据
        End If
End If
    Next
Next
Tables("装配部件临时表").AutoSizeCols()  '自动调整表的列宽

 

网页分析如附件:

 

 

 下载信息  [文件大小:   下载次数: ]
点击浏览该文件:装配部件.txt

 

请蓝老师费心!

[此贴子已经被作者于2020/12/17 22:17:32编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110334 积分:561518 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/12/17 13:34:00 [只看该作者]

Dim dr As Row
For n1 As Integer = 1 To elems.count - 1             '把网页中的第一列取掉,要不然有一行是空值
if elems(n1).InnerText  like "*LJ222009*" Then

    Dim tds = elems(n1).getelementsbytagname("td")    '在网页中查找td(第行中每列的数据)

    dr = Tables("装配部件临时表").AddNew()

……

end if


 回到顶部
帅哥哟,离线,有人找我吗?
cxmxjwlmq
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:349 积分:4070 威望:0 精华:0 注册:2018/4/6 18:02:00
  发帖心情 Post By:2020/12/17 16:22:00 [只看该作者]

蓝老师:谢谢,谢谢!

但还有个问题,需要你再指导一下:

 

if elems(n1).InnerText  like "*LJ222009*" Then  '到时替换成变量:txt

 

就是这句代码,我要把它替换成变速txt,但怎样调整都调不来,

 

If elems(n1).InnerText  Like  "*'" & txt & "'*" Then

 

把这个怎样样调整,"*'" & txt & "'*" ,都没有调整出来!

 

还得麻烦你!汗颜呀!

劳您费心!再次感谢!


 回到顶部
帅哥,在线噢!
有点蓝
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110334 积分:561518 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/12/17 16:37:00 [只看该作者]

去掉单引号

 回到顶部
总数 11 1 2 下一页