以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  有条件下载网页数据  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=159201)

--  作者:cxmxjwlmq
--  发布时间: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编辑过]

--  作者:有点蓝
--  发布时间: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
--  发布时间:2020/12/17 10:58:00
--  

谢谢蓝老师!

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

 如下图:


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

 

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

 


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

 

请老师费心!

谢谢!


--  作者:有点蓝
--  发布时间:2020/12/17 11:26:00
--  
那没有必要判断啊,去掉2楼的判断
--  作者:cxmxjwlmq
--  发布时间:2020/12/17 11:58:00
--  

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

 


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

 

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

 

谢谢,费心了!


--  作者:有点蓝
--  发布时间:2020/12/17 12:06:00
--  
1楼给的代码和页面数据太少,无法判断
--  作者:cxmxjwlmq
--  发布时间: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编辑过]

--  作者:有点蓝
--  发布时间: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
--  发布时间:2020/12/17 16:22:00
--  

蓝老师:谢谢,谢谢!

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

 

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

 

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

 

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

 

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

 

还得麻烦你!汗颜呀!

劳您费心!再次感谢!


--  作者:有点蓝
--  发布时间:2020/12/17 16:37:00
--  
去掉单引号