C# tekst van een website krijgen

Status
Niet open voor verdere reacties.
Zou je daar een voorbeeldje van kunnen maken, want ik snap niet echt hoe ik dat moet doen
 
OK, zal dadelijk eens kijken. Het zal wel ongeveer hetzelfde zijn als de method die de klassen ophaalt.
 
Het is vrijwel hetzelfde:

[CPP]public class TeamDataService : DownloadService
{
private const string BaseUrl = "http://www.wakanutgeve.nl";

public async Task<List<string>> GetTeamUrlsAsync()
{
var url = string.Format("{0}/180/jeugd/", BaseUrl);

Debug.WriteLine("GetTeamsAsync");
Debug.WriteLine("\tfrom url:{0}", url);

var source = await DownloadPageSourceAsync(url);

var doc = new HtmlDocument();
doc.LoadHtml(source);

var teamUrls = new List<string>();

var teamNodes = doc.DocumentNode.SelectNodes("id('Tekstpagina')//a");
foreach (var optionNode in teamNodes)
{
var teamName = optionNode.InnerText.Trim();
if (teamName.Length == 2) //teams like A1, C2, F3
{
var teamUrlPart = optionNode.GetAttributeValue("href", string.Empty);
if (teamUrlPart != string.Empty)
{
teamUrls.Add(BaseUrl + teamUrlPart);
}
}
else
{
Debug.WriteLine("skipped:{0}", teamName);
}
}

Debug.WriteLine("parsed {0} team urls", teamUrls.Count);

foreach (var teamUrl in teamUrls)
{
Debug.WriteLine("\t{0}",teamUrl);
}

return teamUrls;
}
}[/CPP]



Debug Output:
Code:
GetTeamsAsync
	from url:http://www.wakanutgeve.nl/180/jeugd/
skipped:Voorlopige spelersindeling jeugd 2013/2014
skipped:Bambino's
skipped:ZSV-ers in Oranje
skipped:Links
skipped:Organisatie Jeugd
parsed 23 team urls
	http://www.wakanutgeve.nl/284/zsv-a1/
	http://www.wakanutgeve.nl/285/zsv-a2/
	http://www.wakanutgeve.nl/288/zsv-b1/
	http://www.wakanutgeve.nl/289/zsv-b2/
	http://www.wakanutgeve.nl/290/zsv-b3/
	http://www.wakanutgeve.nl/292/zsv-c1/
	http://www.wakanutgeve.nl/293/zsv-c2/
	http://www.wakanutgeve.nl/294/zsv-c3/
	http://www.wakanutgeve.nl/763/zsv-c4/
	http://www.wakanutgeve.nl/755/zsv-c5/
	http://www.wakanutgeve.nl/297/zsv-d1/
	http://www.wakanutgeve.nl/298/zsv-d2/
	http://www.wakanutgeve.nl/299/zsv-d3/
	http://www.wakanutgeve.nl/302/zsv-e1/
	http://www.wakanutgeve.nl/303/zsv-e2/
	http://www.wakanutgeve.nl/305/zsv-e3/
	http://www.wakanutgeve.nl/306/zsv-e4/
	http://www.wakanutgeve.nl/307/zsv-e5/
	http://www.wakanutgeve.nl/308/zsv-e6/
	http://www.wakanutgeve.nl/311/zsv-f1/
	http://www.wakanutgeve.nl/312/zsv-f2/
	http://www.wakanutgeve.nl/313/zsv-f3/
	http://www.wakanutgeve.nl/315/zsv-f4/
 
En hoe zorg ik er dan voor dat als je op B2 klikt dat ie dan die url daarvan gebruikt?
 
Even de method aanpassen om list of class 'Team' te krijgen dan staan de teams met naam en url dus in een class en zijn gekoppeld:

[CPP]public class TeamDataService : DownloadService
{
private const string BaseUrl = "http://www.wakanutgeve.nl";

public async Task<List<Team>> GetTeamsAsync()
{
var url = string.Format("{0}/180/jeugd/", BaseUrl);

Debug.WriteLine("GetTeamsAsync");
Debug.WriteLine("\tfrom url:{0}", url);

var source = await DownloadPageSourceAsync(url);

var doc = new HtmlDocument();
doc.LoadHtml(source);

var teams = new List<Team>();

var teamNodes = doc.DocumentNode.SelectNodes("id('Tekstpagina')//a");
foreach (var optionNode in teamNodes)
{
var teamName = optionNode.InnerText.Trim();
if (teamName.Length == 2) //teams like A1, C2, F3
{
var teamUrlPart = optionNode.GetAttributeValue("href", string.Empty);
if (teamUrlPart != string.Empty)
{
teams.Add(new Team(teamName, BaseUrl + teamUrlPart));
}
}
else
{
Debug.WriteLine("skipped:{0}", teamName);
}
}

Debug.WriteLine("parsed {0} teams", teams.Count);

foreach (var team in teams)
Debug.WriteLine("\t{0}", team);

return teams;
}
}[/CPP]

Team Class:
[CPP]public class Team
{
public Team(string name, string url)
{
Name = name;
Url = url;
}

public string Name { get; set; }
public string Url { get; set; }
//more team properties like players and what not

public override string ToString()
{
return string.Format("{0} [{1}]", Name, Url);
}
}[/CPP]

Debug Output:
Code:
GetTeamsAsync
	from url:http://www.wakanutgeve.nl/180/jeugd/
skipped:Voorlopige spelersindeling jeugd 2013/2014
skipped:Bambino's
skipped:ZSV-ers in Oranje
skipped:Links
skipped:Organisatie Jeugd
parsed 23 teams
	A1 [http://www.wakanutgeve.nl/284/zsv-a1/]
	A2 [http://www.wakanutgeve.nl/285/zsv-a2/]
	B1 [http://www.wakanutgeve.nl/288/zsv-b1/]
	B2 [http://www.wakanutgeve.nl/289/zsv-b2/]
	B3 [http://www.wakanutgeve.nl/290/zsv-b3/]
	C1 [http://www.wakanutgeve.nl/292/zsv-c1/]
	C2 [http://www.wakanutgeve.nl/293/zsv-c2/]
	C3 [http://www.wakanutgeve.nl/294/zsv-c3/]
	C4 [http://www.wakanutgeve.nl/763/zsv-c4/]
	C5 [http://www.wakanutgeve.nl/755/zsv-c5/]
	D1 [http://www.wakanutgeve.nl/297/zsv-d1/]
	D2 [http://www.wakanutgeve.nl/298/zsv-d2/]
	D3 [http://www.wakanutgeve.nl/299/zsv-d3/]
	E1 [http://www.wakanutgeve.nl/302/zsv-e1/]
	E2 [http://www.wakanutgeve.nl/303/zsv-e2/]
	E3 [http://www.wakanutgeve.nl/305/zsv-e3/]
	E4 [http://www.wakanutgeve.nl/306/zsv-e4/]
	E5 [http://www.wakanutgeve.nl/307/zsv-e5/]
	E6 [http://www.wakanutgeve.nl/308/zsv-e6/]
	F1 [http://www.wakanutgeve.nl/311/zsv-f1/]
	F2 [http://www.wakanutgeve.nl/312/zsv-f2/]
	F3 [http://www.wakanutgeve.nl/313/zsv-f3/]
	F4 [http://www.wakanutgeve.nl/315/zsv-f4/]
 
Je kunt die list bijvoorbeeld in de list control gooien en als je er op klikt kun je de naam+url meegeven met de querystring en dan alles laden.
De teams hebben allemaal dezelfde dingen zoals een lijst spelers etc dus daar kun je ook op binden.
 
In je grid click method kun je via de data context (je binding) het team eruit vissen waar je op klikt(het is een object dus even casten naar Team class). En de gegevens in de query zetten.

[CPP]private void Team_Click(object sender, System.Windows.Input.GestureEventArgs e)
{
var team = (Team)(((Grid)sender).DataContext);

var query = string.Format("name={0}&url={1}", team.Name, team.Url);
NavigationService.Navigate(new Uri("/teaminfo.xaml?" + query, UriKind.Relative));
}[/CPP]


En dan in je teaminfo page de query uitzoeken en gebruiken.
[CPP]public partial class teaminfo : PhoneApplicationPage
{
public teaminfo()
{
InitializeComponent();
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);

if (NavigationContext.QueryString != null)
{
var title = NavigationContext.QueryString["name"];
titel.Title = title;

var url = NavigationContext.QueryString["url"];
//use url to download team data
}
}
}[/CPP]
 
bij deze pagina kun je op de icoontjes klikken om naar de competitie pagina , maar als ik bij element inspecteren kijk bij de url ervan staan er sommigen met wakanutgeve.nl ervoor en een paar zonder, hoe krijg ik die dan in één goede lijst?
 
[CPP]ublic async Task<List<TeamMenu>> GetTeamMenuAsync(string teamUrlPart)
{
var url = string.Format("{0}{1}", BaseUrl, teamUrlPart);

Debug.WriteLine("GetTeamMenuAsync");
Debug.WriteLine("\tfrom url:{0}", url);

var source = await DownloadPageSourceAsync(url);

var doc = new HtmlDocument();
doc.LoadHtml(source);

var teammenu = new List<TeamMenu>();

var teamNodes = doc.DocumentNode.SelectNodes("id('Tekstpagina')//a");
foreach (var optionNode in teamNodes)
{

var TeamMenuUrl = optionNode.GetAttributeValue("href", string.Empty);
if (TeamMenuUrl != string.Empty)
{
teammenu.Add(new TeamMenu(BaseUrl, TeamMenuUrl));
}
}

return teammenu;
}[/CPP]

klopt dit om de links op te halen
 
Om te weten of de code klopt moet je hem gewoon uitvoeren :p (door de debug logging kun je het gewoon uitvoeren zonder UI te maken)

Wat je ook kunt doen is een 'debug' pagina (in menu items waar je about page staat) maken wat knoppen die de code uitvoeren die je wilt testen. Zo hoef je niet door alles heen te lopen met testen.

Ik denk dat de 'var url = string.Format("{0}{1}", BaseUrl, teamUrlPart);' niet goed is in dit geval omdat ik de method had geschreven zodat je de gehele url hebt in je team class. Dan zou de baseurl niet nodig zijn.

(en de gele kleur met witte letters is moeilijk te lezen)
 
[CPP] var url = NavigationContext.QueryString["url"];
//use url to download team data[/CPP]

Hoe moet ik dan die url gebruiken om de data te downloaden?
 
Hetzelfde als alle andere, je hebt steeds een URL en dan gebruik je die om de data op te halen en eventueel meer url's.

Met http://www.wakanutgeve.nl/180/jeugd/ heb je namen en url's van teams.
Met de team Url haal je de namen van trainers op en de url's van de info/competitie.
Met info url haal je weer de namen van spelers op en de url van hun profiel. etc. een lange ketting tot je alles hebt wat je wilt.

Het is allemaal hetzelfde principe, rooster ophalen, uitslagen ophalen, spelers ophalen. Kost alleen tijd om uit te zoeken wat het xpath is naar de data die je wilt.
 
Ja, je hebt dadelijk een heleboel methods om alles binnen te halen die allemaal op elkaar lijken.
Je kunt ook de class opsplitsen om alles overzichtelijk te houden. Class voor nieuws, teams, uitslagen etc.

Ook kun je eens kijken of je methods kunt wijzigen om alles korter en makkelijker te maken.


bv een extra method in de baseclass erbij zetten die in plaats van de source meteen het document geeft:

[CPP]protected async Task<HtmlDocument> DownloadDocumentAsync(string url)
{
var request = WebRequest.CreateHttp(url);
var response = await request.GetResponseAsync();

string pageSource;
using (var responseStream = response.GetResponseStream())
{
using (var reader = new StreamReader(responseStream))
{
pageSource = await reader.ReadToEndAsync();
}
}

var doc = new HtmlDocument();
doc.Load(pageSource);

return doc;
}[/CPP]


Dan kun je in plaats van:
Code:
var source = await DownloadPageSourceAsync(url);

var doc = new HtmlDocument();
doc.LoadHtml(source);
dit doen als je de source string niet nodig hebt
Code:
var doc = await DownloadDocumentAsync(url);
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan