PDA

View Full Version : سوال: مشکل در این عبارت باقاعده



hercool
پنج شنبه 03 مرداد 1392, 14:40 عصر
سلام خدمت دوستان
من دارم سعی می کنم اطلاعات بین رو تگ span رو بکشم بیرون اما هر کاری می کنم نمیشه نمونه میزنم ممنون میمش راهنماییم کنید
نمونه کد برای واکشی اطلاعات


<div id="divPortfo" style="overflow: auto; width: 970px; height: 550px;">
<table id="Table26" style="border-top-width: 1px; border-left-width: 1px; border-left-color: dimgray; border-bottom-width: 1px; border-bottom-color: dimgray; width: 2000px; border-top-color: dimgray; border-right-width: 1px; border-right-color: dimgray" border="0" cellpadding="0" cellspacing="0">
<tbody><tr>
<td colspan="2" rowspan="1" style="width: 470px" height="18">
<span id="Label100" class="label" style="display:inline-block;color:Navy;width:100%;">صورت وضعیت </span>
</td>
<td style="width: 90px" height="18" align="right">
<input name="txbPortfoCompanyRef" id="txbPortfoCompanyRef" readonly="readOnly" style="width: 4px; height: 16px" type="hidden"><input name="txbCurrentYearSerial" id="txbCurrentYearSerial" readonly="readOnly" style="width: 4px; height: 16px" type="hidden"><input name="txbPastYearSerial" id="txbPastYearSerial" readonly="readOnly" style="width: 4px; height: 16px" type="hidden">
</td>
</tr>
<tr>
<td id="tdDescribtion" rowspan="2" style="border-right: #647dbc 1px solid; border-top: #647dbc 1px solid; border-left: #647dbc 1px solid; color: #333399; border-bottom: #647dbc 1px solid; background-color: #afbad8" align="center">شرح
</td>
<td colspan="2" style="border-top: #647dbc 1px solid; border-left: #647dbc 1px solid; color: #333399; height: 15px; background-color: #afbad8; border-bottom-width: 1px; border-bottom-color: #647dbc; border-right-width: 1px; border-right-color: #647dbc;" align="center">
<span id="lblPortfoPast" class="label">تاریخ 1391/12/30</span>
</td>
<td colspan="2" style="border-top: #647dbc 1px solid; border-left: #647dbc 1px solid; color: #333399; height: 15px; background-color: #afbad8; border-bottom-width: 1px; border-bottom-color: #647dbc; border-right-width: 1px; border-right-color: #647dbc;" align="center">
<span id="lblPortfoCurr" class="label">سود دهی به 1392/12/29</span>
</td>
<td rowspan="2" style="border-top: #647dbc 1px solid; border-left: #647dbc 1px solid; width: 5%; color: #333399; border-bottom: #647dbc 1px solid; background-color: #afbad8; border-right-width: 1px; border-right-color: #647dbc" align="center">
<span id="lblPortfoCurrPeriod" class="label">وسود اصلی 1392/03/31</span>
</td>
</tr>حالا کدی که من نوشتم اینه

private void button1_Click(object sender, EventArgs e)
{
box.Text = webBrowser1.DocumentText;
Regex regx = new Regex(@"<div(.*?)id=[""']divPortfo[""'](.*?)/>", RegexOptions.Singleline);
MatchCollection mactches = regx.Matches(box.Text);
foreach (Match match in mactches)
{
Regex regxi = new Regex(@"<table(.*?)id=[""'](.*?)[""'](.*?)/>", RegexOptions.Singleline);

mactches = regxi.Matches(match.Value);
foreach (Match matchsname in mactches)
{
regxi = new Regex(@"<td (.*?)>(.*?)</td>", RegexOptions.Singleline);
mactches = regxi.Matches(match.Value);
foreach (Match matchs in mactches)
{
regxi = new Regex(@"<span (.*?)>(.*?)</span>", RegexOptions.Singleline);
mactches = regxi.Matches(match.Value);
foreach (Match matchi in mactches)
{
MessageBox.Show(""+ mactches);
valuee = Regex.Replace(matchi.Value, @">(.*?)</", "");
valuee = Regex.Replace(valuee, @"[""']", "");
listBox1.Items.Add(valuee);
}
}
}
}
}


اما نشد که نشد تعداد td ها بیشتر و span ها هم متقابلا زیاد هست
منتظر راهنماییتون هستم

hercool
پنج شنبه 03 مرداد 1392, 21:23 عصر
من به صورت ساده کد رو امتحان کردم درونی ترین تگ رو میگیره نمی دونم چکار کنم

private void button2_Click(object sender, EventArgs e)
{
string texto = "<Table><tr><td><span>hefziat</span></td> <td> <span>masoud hi </span></td></tr> </Table>";
//MessageBox.Show("d" + texto);
string pattern1 = @"<span>(.*?)</span>";
//string tag = "</li>";
Regex regex = new Regex(pattern1);
MatchCollection mache = regex.Matches(texto);
foreach (Match mach in mache)
{
Match match = regex.Match(texto);
int cs;
for (cs = 0; cs < 100; cs++)
{
string myText = match.Groups[cs].Value;

//myText = myText.Remove(0, myText.IndexOf(tag) + tag.Length);
listBox1.Items.Add(myText);
}
}

behzadkhan
جمعه 04 مرداد 1392, 01:08 صبح
سلام

(باید مثل یک کامپایلر فکر کرد)
======================
اگه منظورت از خروجی اینهاست:
صورت وضعیت
تاریخ 1391/12/30
سود دهی به 1392/12/29
وسود اصلی 1392/03/31

باید کمی صبر کنی تا کدش را بزنم.

در غیر این صورت بیشتر توضیح بده

با تشکر

behzadkhan
دوشنبه 07 مرداد 1392, 01:03 صبح
با سلام

این برنامه مواردی را که در پست قبلی گفتم چاپ می کند.(البته اگر از spanهای تودرتو استفاده نشود)


using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string text = File.ReadAllText(@"c:\1.txt");

int i = 0, start = 0, end = 0, TotalSpan = 0;

while ((i = text.IndexOf("<span", i)) != -1)
{
start = text.IndexOf(">",i) + 1;

end = text.IndexOf(@"</span>", start);
Console.WriteLine(text.Substring(start, end - start));
TotalSpan++;
i++;
Console.ReadKey();
}

System.Console.WriteLine("=======================================");
System.Console.WriteLine("Total '<span></span>' = {0}", TotalSpan++);
Console.ReadKey();
}
}
}


==================================
اگر مشکلت حل نشد اعلام کن.

با تشکر

hercool
سه شنبه 08 مرداد 1392, 17:07 عصر
ممنون بهزاد جان اما این برنامه ای که شما نوشتی کارش اینه که بره تعداد span ها رو بشماره
اما کدی که من دنبالشم اینه که بره مقادیر بین دو تگ span رو بگیره تا حدودی رسیدم به این موضوع اما کامل نیست
نمونه میزارم
private void button2_Click(object sender, EventArgs e)
{
string texto = "<Table><span>mitra</span><tr><td><span>hefziat</span></td> <td> <span>masoud hi </span></td></tr> </Table>";
//MessageBox.Show("d" + texto);
string pattern1 = @"<span>(.*?)</span>";
//string tag = "</li>";
Regex regex = new Regex(pattern1);
MatchCollection mache = regex.Matches(texto);
foreach (Match mach in mache)
{
Match match = regex.Match(texto);
int cs;
for (cs = 0; cs < 100; cs++)
{
string myText = match.Groups[cs].Value;

//myText = myText.Remove(0, myText.IndexOf(tag) + tag.Length);
listBox1.Items.Add(myText);
}
}
}

حالا این کار نمیکنه چه برسه باینکه بر اساس ای دی های دسته بندی بشن و مقدارشون جلوی نام ای دیشون ریخته بشه داخل متغییر ها یا اینکه در لیست باکس نشون داده بشه