PDA

View Full Version : استخراج کلمات موجود در یک صفحه وب با سی شارپ



hanis29268
چهارشنبه 22 مرداد 1393, 15:33 عصر
سلام،
وقت بخیر خدمت دوستان گرامی،
دوستان من میخوام یه آدرس صفحه وب رو به برنامه بدم و برنامه بره هرچی لغت توی صفحه هست رو بیاره، برای شروع نیاز به یه راهنمایی دارم.
ممنون.

aminmousavi
چهارشنبه 22 مرداد 1393, 15:49 عصر
سلام دوست عزیز ، منظورتون از لغت چیه ؟ innerText کل سایت منظورتون هست ؟ دقیقا چه چیزی رو میخواهید برنامه استخراج کند ؟ چه ساختاری داره مقداری که میخواهید استخراج کند ؟

hanis29268
چهارشنبه 22 مرداد 1393, 15:54 عصر
هر کلمه ای که به عنوان متن توی صفحه موجود باشه رو میخوام استخراج کنم، بعدش اینارو میخوام توی دیتابیس ذخیره شون کنم.

aminmousavi
چهارشنبه 22 مرداد 1393, 16:09 عصر
برای اینکار چند روش هست
1- کل HTML سایت رو بخونین و تگ ها رو حذف کنین و سپس تک به تک لغات رو جدا کنین
2- پیمایش تگ رو داشته باشین ، وارد هر تگ بشن innerText رو بردارین و لغات و جدا کنین

چون روش اول دم دستی تر و ساده تر هست رو براتون نمونه کدش رو میزام :
روش کار : یک کلاس به نام OperText بسازید و کد های زیر رو درونش بنویسید :


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


namespace BarnameNevis
{
class OperText
{
private readonly Regex _tags_ = new Regex(@"<[^>]+?>", RegexOptions.Multiline | RegexOptions.Compiled);
private readonly Regex _notOkCharacter_ = new Regex(@"[^\w;&#@.:/\\?=|%!() -]", RegexOptions.Compiled);


public String RemoveHTMLTAG(String html)
{
html = RemoveTag(html, "<!--", "-->");
html = RemoveTag(html, "<script", "</script>");
html = RemoveTag(html, "<style", "</style>");


//replace matches of these regexes with space
html = _tags_.Replace(html, " ");
html = _notOkCharacter_.Replace(html, " ");
html = SingleSpacedTrim(html);


return html;
}
private String RemoveTag(String html, String startTag, String endTag)
{
Boolean bAgain;
do
{
bAgain = false;
Int32 startTagPos = html.IndexOf(startTag, 0, StringComparison.CurrentCultureIgnoreCase);
if (startTagPos < 0)
continue;
Int32 endTagPos = html.IndexOf(endTag, startTagPos + 1, StringComparison.CurrentCultureIgnoreCase);
if (endTagPos <= startTagPos)
continue;
html = html.Remove(startTagPos, endTagPos - startTagPos + endTag.Length);
bAgain = true;
} while (bAgain);
return html;
}


private String SingleSpacedTrim(String inString)
{
StringBuilder sb = new StringBuilder();
Boolean inBlanks = false;
foreach (Char c in inString)
{
switch (c)
{
case '\r':
case '\n':
case '\t':
case ' ':
if (!inBlanks)
{
inBlanks = true;
sb.Append(' ');
}
continue;
default:
inBlanks = false;
sb.Append(c);
break;
}
}
return sb.ToString().Trim();
}
}
}






کلاس بالا باعث میشود تگ های HTML رو حذف کند ، در فرم تون هم از کد زیر استفاده کنید :




listBox1.Items.Clear();
OperText operation = new OperText();
string[] words = operation.RemoveHTMLTAG(webBrowser1.DocumentText). Split(' ');
for (int i = 0; i < words.Length; i++)
{
listBox1.Items.Add(words[i]);
}

bigswift
سه شنبه 14 شهریور 1396, 02:34 صبح
146228146228دوستان من 2 تا مشکل دارم
1) اروری که میگه :
System.Xml.XmlException: 'The 'link' start tag on line 56 position 228 does not match the end tag of 'head'. Line 56, position 344.'
2)من می خوام اطلاعات جدولی که در فایل پیوست هست رو استخراج کنم ولی نمی تونم یعنی بلد نیستم
مرسی از همراهیتون :خجالت:

mze666
شنبه 18 شهریور 1396, 20:00 عصر
سلام،
وقت بخیر خدمت دوستان گرامی،
دوستان من میخوام یه آدرس صفحه وب رو به برنامه بدم و برنامه بره هرچی لغت توی صفحه هست رو بیاره، برای شروع نیاز به یه راهنمایی دارم.
ممنون.

http://html-agility-pack.net/

samiasoft
یک شنبه 19 شهریور 1396, 00:15 صبح
http://html-agility-pack.net/

تشکر بابت معرفی این کتابخانه

من دو مورد زیر رو متوجه نشدم راهنمایی میکنید ؟

// With XPath var value = doc.DocumentNode
.SelectNodes("//td/input")
.First()
.Attributes["value"].Value;

// With LINQ
var nodes = doc.DocumentNode.Descendants("input")
.Select(y => y.Descendants()
.Where(x => x.Attributes["class"].Value == "box"))
.ToList();


var nodes = doc.DocumentNode.Descendants("input");