Pop

Curso HTML5. Novedades - 6. Más tipos de input: month,week y date

6. Curso HTML5. Novedades. Nuevos tipos de input: tel,number y range

  • Vamos a continuar con nuestro curso de html . Después de ver en la entrada anterior algunas de las nuevas campos de formulario que traía html5. En este capítulo continuamos con nuevos tipos de input month,week y date.
  • Vamos con los nuevos campos de formulario que veremos en este capítulo: 
  1. Campo date: El calendario le permite al usuario seleccionar un día que será ingresado en el campo junto con el resto de la fecha. Un ejemplo de uso es cuando  necesitamos proporcionar un método para seleccionar una fecha. Gracias al tipo date ahora es el navegador el que se encarga de construir un almanaque.
  2. Campo week : Este tipo de campo ofrece una interface similar a date, pero solo para seleccionar una semana completa
  3. Campo month: Similar al tipo de campo previo, éste es específico para seleccionar meses. Normalmente el valor esperado tiene la sintaxis año-mes.
  • Aquí os dejo un vídeo con ejemplos de uso de estos controles:
  • Os dejo también el código html visto en el vídeo:
 <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Pruebas</title>
    <link href="StyleSheet1.css" rel="stylesheet" />
</head>
<body>
    <form>
        <article>
            <header>
                <h1>Mi primera página html</h1>
            </header>
        </article>
        <nav>
            <ul>
                <li><a href="#">Uno</a></li>
                <li><a href="#">Dos</a></li>
                <li><a href="#">Tres</a></li>
                <li><a href="#">Cuatro</a></li>
            </ul>
        </nav>
        <article class="pagina">
            <section class="contenedor">
                <br />
                <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNIIrOH9SJeXDSEeOFtMxez5Zfnozh9J3l27GClLeYM0LZSaUFN1zCiN3AG604Yxm03evhidS9gxy9bkM9TtOrgoBP1yPbk6CFIb6v8oiqpxWOMVcbEc-h66TLgHrRYXSZ0ZxPhSdtb0A/s640/Basedatosnba.png" />
                <figcaption><mark> diseño de BBDD para web Scrapping</mark></figcaption>
            </section>
            <aside>
              
                    <input type="search" placeholder="Busqueda" />
                    <input type="email" placeholder="email" />
                    <input type="url" placeholder="url"  />
                    <input type="tel" placeholder="telefono" /><br />
                    <input type="number" placeholder="numero" min="0" max="10" />
                    <input type="range" name="nunmero" id="numero"  min="0" max="100" step="25" /> <br />
                    <input type="date" name="fecha" id="fecha"   />
                    <input type="week" name="semana" id="semana"  />
                    <input type="month" name="mes" id="mes" />
                    <input type="submit" value="Enviar" />
               
            </aside>
        </article>
        <article class="pagina">
            <section class="contenedor">
                <br />
                <mark>ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ</mark> <br />
                ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br />
                ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br />
                ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br />
            </section>
            <aside>
                <p>YYYYYYYYYYYYYYYy</p>
            </aside>
        </article>
        <article>
            <footer>
                <ul>
                    <li><a href="#">Derechos de uso</a></li>
                    <li><a href="#">Copyright</a></li>
                </ul>
            </footer>
        </article>
    </form>
</body>
</html>

Curso HTML5. Novedades - 5. Nuevos input tel,number y range

5. Curso HTML5. Novedades. Nuevos tipos de input: tel,number y range

  • Vamos a continuar con nuestro curso de html . Después de ver en la entrada anterior algunas de las nuevas campos de formulario que traía html5. En este capítulo veremos el funcionamiento de los input tipo tel, number y range.
  • Vamos con los nuevos campos de formulario que veremos en este capítulo: 
  1. Campo tel: Este tipo de campo es para números telefónicos. A diferencia de los tipos email y url, el tipo tel no requiere ninguna sintaxis en particular. Es solo un indicación para el navegador en caso de que necesite hacer ajustes de acuerdo al dispositivo en el que la aplicación es ejecutada.
  2. Campo number: el tipo number es sólo válido cuando recibe una entrada numérica. Existen algunos atributos nuevos que pueden ser útiles para este campo: 
    1.  min: El valor de este atributo determina el mínimo valor aceptado para el campo.
    2.  max: El valor de este atributo determina el máximo valor aceptado para el campo.
    3.  step: El valor de este atributo determina el tamaño en el que el valor será incrementado disminuido en cada paso. 
  3. Campo range: Este nuevo control le permite al usuario seleccionar un valor a partir de una serie de valores o rango. Normalmente es mostrado en pantalla como una puntero deslizable o un campo con flechas para seleccionar un valor entre los predeterminados
  • Aquí os dejo un vídeo con ejemplos de uso de estos controles:
  • Os dejo también el código html visto en el vídeo:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Pruebas</title>
    <link href="StyleSheet1.css" rel="stylesheet" />
</head>
<body>
    <form>
        <article>
            <header>
                <h1>Mi primera página html</h1>
            </header>
        </article>
        <nav>
            <ul>
                <li><a href="#">Uno</a></li>
                <li><a href="#">Dos</a></li>
                <li><a href="#">Tres</a></li>
                <li><a href="#">Cuatro</a></li>
            </ul>
        </nav>
        <article class="pagina">
            <section class="contenedor">
                <br />
                <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNIIrOH9SJeXDSEeOFtMxez5Zfnozh9J3l27GClLeYM0LZSaUFN1zCiN3AG604Yxm03evhidS9gxy9bkM9TtOrgoBP1yPbk6CFIb6v8oiqpxWOMVcbEc-h66TLgHrRYXSZ0ZxPhSdtb0A/s640/Basedatosnba.png" />
                <figcaption><mark> diseño de BBDD para web Scrapping</mark></figcaption>
            </section>
            <aside>
              
                    <input type="search" placeholder="Busqueda" />
                    <input type="email" placeholder="email" />
                    <input type="url" placeholder="url"  />
                    <input type="tel" placeholder="telefono" /><br />
                    <input type="number" placeholder="numero" min="0" max="10" />
                    <input type="range" name="nunmero" id="numero"  min="0" max="100" step="25" />
                    <input type="submit" value="Enviar" />
               
            </aside>
        </article>
        <article class="pagina">
            <section class="contenedor">
                <br />
                <mark>ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ</mark> <br />
                ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br />
                ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br />
                ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br />
            </section>
            <aside>
                <p>YYYYYYYYYYYYYYYy</p>
            </aside>
        </article>
        <article>
            <footer>
                <ul>
                    <li><a href="#">Derechos de uso</a></li>
                    <li><a href="#">Copyright</a></li>
                </ul>
            </footer>
        </article>
    </form>
</body>
</html>

Curso HTML5. Novedades - 4. Nuevos campos de formulario 👌

4. Curso HTML5. Novedades. Nuevos campos formulario

  • Vamos a continuar con nuestro curso de html . Después de ver en la entrada anterior algunas de las nuevas etiquetas que trajo html5. En este capítulo veremos algunos de los nuevos campos de formulario que se introdujeron con esta versión.
  1. El tipo search (búsqueda) no controla la entrada, es solo una indicación para los navegadores. Al detectar este tipo de campo algunos navegadores cambiarán el diseño del elemento.
  2. Podemos especificar también un input de tipo email que hará que el navegador detecte si el valor que hemos introducido tiene el formato correcto para ser un email : <input type="email" placeholder="email" />
  3. Otro de los tipos de input que podemos utilizar  es el del tipo url que hará que el navegador detecte si el valor que hemos introducido tiene el formato correcto para ser email:  <input type="url" placeholder="url" required />
  • Aquí os dejo un vídeo con ejemplos de uso de estas etiquetas:

  • Os dejo también el código html visto en el vídeo:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Pruebas</title>
    <link href="StyleSheet1.css" rel="stylesheet" />
</head>
<body>
    <form>
        <article>
            <header>
                <h1>Mi primera página html</h1>
            </header>
        </article>
        <nav>
            <ul>
                <li><a href="#">Uno</a></li>
                <li><a href="#">Dos</a></li>
                <li><a href="#">Tres</a></li>
                <li><a href="#">Cuatro</a></li>
            </ul>
        </nav>
        <article class="pagina">
            <section class="contenedor">
                <br />
                <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNIIrOH9SJeXDSEeOFtMxez5Zfnozh9J3l27GClLeYM0LZSaUFN1zCiN3AG604Yxm03evhidS9gxy9bkM9TtOrgoBP1yPbk6CFIb6v8oiqpxWOMVcbEc-h66TLgHrRYXSZ0ZxPhSdtb0A/s640/Basedatosnba.png" />
                <figcaption><mark> diseño de BBDD para web Scrapping</mark></figcaption>
            </section>
            <aside>
                <figure>
                    <input type="search" placeholder="Busqueda" />
                    <input type="email" placeholder="email" />
                    <input type="url" placeholder="url" required />
                    <input type="submit" value="Enviar" />
                </figure>
            </aside>
        </article>
        <article class="pagina">
            <section class="contenedor">
                <br />
                <mark>ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ</mark> <br />
                ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br />
                ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br />
                ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br />
            </section>
            <aside>
                <p>YYYYYYYYYYYYYYYy</p>
            </aside>
        </article>
        <article>
            <footer>
                <ul>
                    <li><a href="#">Derechos de uso</a></li>
                    <li><a href="#">Copyright</a></li>
                </ul>
            </footer>
        </article>
    </form>
</body>
</html>

Curso HTML5. Novedades - 3.Más etiquetas nuevas

3. Curso HTML5. Novedades. Más etiquetas nuevas

  • Vamos a continuar con nuestro curso de html . Después de ver en la entrada anterior algunas de las nuevas etiquetas que trajo html5. En este capítulo  continuaremos viendo más etiqueta nuevas.
  • Las etiquetas con las que vamos a trabajar en esta entrada son: <article> ,<mark>,<figure>,y <figcaption>.  Vamos con una breve descripción de cada una de ellas:
  1. <article>: para usar en lugar de<div class="article">. El elemento "article" puede anidarse dentro de otro “article”.
  2. <mark>: Para diferenciar un texto remarcado.
  3. <figure>: Illustraciones, diagramas, fotos, etc
  4. <figcaption>: representa un subtítulo o leyenda asociada el contenido de the <figure> element al cual está anidado.
  • Aquí os dejo un vídeo con ejemplos de uso de estas etiquetas:

  • Os dejo también el código html visto en el vídeo:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Pruebas</title>
<link href="StyleSheet1.css" rel="stylesheet" />
</head>
<body>
<article>
<header>
<h1>Mi primera página html</h1>
</header>
</article>
<nav>
<ul>
<li><a href="#">Uno</a></li>
<li><a href="#">Dos</a></li>
<li><a href="#">Tres</a></li>
<li><a href="#">Cuatro</a></li>
</ul>
</nav>
<article class="pagina">
<section class="contenedor">
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxx<br />
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxx<br />
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxx<br />
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxx<br />
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxx<br />
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxx<br />
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxx<br />
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxx<br />
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxx<br />
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxx<br />
</section>
<aside>
<figure>
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNIIrOH9SJeXDSEeOFtMxez5Zfnozh9J3l27GClLeYM0LZSaUFN1zCiN3AG604Yxm03evhidS9gxy9bkM9TtOrgoBP1yPbk6CFIb6v8oiqpxWOMVcbEc-h66TLgHrRYXSZ0ZxPhSdtb0A/s640/Basedatosnba.png" />
<figcaption><mark> diseño de BBDD para web Scrapping</mark></figcaption>
</figure>
</aside>
</article>
<article class="pagina">
<section class="contenedor">
<br />
   <mark>ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ</mark> <br />
      ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br />
              ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br />
              ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br /> </section>
<aside>
<p>YYYYYYYYYYYYYYYy</p>
</aside>
</article>
<article>
<footer>
<ul>
<li><a href="#">Derechos de uso</a></li>
<li><a href="#">Copyright</a></li>
</ul>
</footer>
</article>
</body>
</html>

Curso HTML5. Novedades - 2.Nuevas etiquetas

2. Curso HTML5. Novedades. Nuevas etiquetas

  • Vamos a continuar con nuestro curso de html . Después de ver en la entrada anterior una introducción al mundo html. En este capítulo vamos a conocer algunas de las nuevas etiquetas que se introdujeron con la llega de html5.
  • Las etiquetas con las que vamos a trabajar en esta entrada son: <header>,<footer>, <nav>,<section>,<aside>.  Vamos con una breve descripción de cada una de ellas:
  1. <Header>: <head> Tradicionalmente es la cabecera de un documento. <header> aparece para ser considerada como la cabecera de cualquier otra cosa.
  2. <Footer>: Aparece para ser considerada como el pie de cualquier cosa.
  3. <Section>: contiene la información más relevante del documento.
  4. <nav>: Representa un bloque de navegación. 
  5. <aside>: Es una sección que está relacionada con la principal que que ocupa una posición lateral
  • Aquí os dejo un vídeo con ejemplos de uso de estas etiquetas:


  • Os dejo también los elementos creados en nuestra hoja de estilos:
ul {
list-style-type: none;
margin: 0;
padding: 0;
overflow: hidden;
background-color: #333333;
}

li {
float: left;
}

li a {
display: block;
color: white;
text-align: center;
padding: 16px;
text-decoration: none;
}

li a:hover {
background-color: #111111;
}

.pagina {
display: table;
width: 100%
}

.contenedor {
float: left;
width: 60%
}

aside {
float: right;
width: 40%
}

  • y nuestra página html donde estamos haciendo las pruebas:

   <header>
<h1>  Mi primera página html</h1> 
</header>
<nav>
<ul>
<li><a href="#">Uno 1</a></li>
<li><a href="#">Dos 2</a></li>
<li><a href="#">Tres 3</a></li>
</ul>
</nav>
<div class="pagina">
<section class="contenedor">
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxxx<br />
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxxx<br />
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxxx<br />
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxxx<br />
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxxx<br />
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxxx<br />
</section>
<aside>
<p>YYYYYYYYYYYYYYYYYYYYYYYYYYYYYy</p>
</aside>

</div>
<footer>
<ul>
<li><a href="#">Derecho de uso</a></li>
<li><a href="#">Copyright</a></li>
</ul>
</footer>

Curso HTML5. Novedades - 1. Introducción

1. Curso HTML5. Novedades. Introducción

  • En esta ocasión vamos a comenzar un nuevo curso. Después de ver en entradas anteriores conceptos relacionados con el lenguaje de programación c# y el manejo de bases de datos con SQL. Ahora  empezaremos a ver las novedades que introdujo html5
  •  Antes de continuar, aclarar que yo considero html un lenguaje de marcado, no un lenguaje de programación. Históricamente los lenguajes de marcado suelen confundirse con lenguajes de programación. Sin embargo, no son lo mismo, ya que el lenguaje de marcado no tiene funciones aritméticas o variables, como poseen los lenguajes de programación
  • Ahora os dejo el vídeo donde cuento que temas trataremos en el curso y donde creamos nuestra primera página html:


  • También como acostumbro os dejo las etiquetas correspondientes a nuestra primera página web:
  <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Pruebas</title>
<link href="StyleSheet1.css" rel="stylesheet" />
</head>
<body>
<b>Mi primera página html</b>
</body>
</html>

Bot web Scraping en español - ESPN- Parte 8 (Final)

8. Web Scraping de la página ESPN

  •  En este capítulo del curso de programación en c# con visual studio 2017 finalizamos nuestro tutorial sobre web Scraping. El último paso que nos queda es guardar en nuestras tablas las estadísticas de cada temporada de los jugadores que conseguimos de la web ESPN. Nos quedan por rellenar la tabla JUGADORES_HISTORICO  y la tabla ESTADISTICAS , correspondientes a este diagrama:
  • Para rellenar estas tablas hemos creado un procedimiento almacenado al que llamaremos desde nuestra aplicación de consola.En el vídeo os lo cuento con más detalle:

  • El procedimiento almacenado que ejecutamos es el siguiente:
ALTER PROCEDURE [dbo].[GuardarEstadisticasJugadorNBA](
@Jugador varchar(500),
@Equipo varchar(50),
@temporada varchar(50),
@PJugados int,
@Minutos float,
@Puntos float,
@rebotes float,
@tapones float,
@asistencias float,
@robos float,
@totCArrera bit
)
AS
BEGIN

SET NOCOUNT ON;

DECLARE @idJugador int
DECLARE @idEquipo int
DECLARE @idEst int
INSERT INTO dbo.ESTADISTICAS(PJugados,Minutos,Puntos,Rebotes,Tapones,Asistencias,Robos,TotalCarrera)
VALUES (@PJugados,@Minutos,@Puntos,@rebotes,@tapones,@asistencias,@robos,@totCArrera)

SET @idEst =SCOPE_IDENTITY() 

-- Obtenemos el idjugador 
SELECT @idjugador = id FROM  JUGADORES with(nolock) where Jugador=@Jugador
SELECT @idEquipo=Id FROM EQUIPOS with(nolock) where Acronimo=@Equipo


INSERT INTO dbo.JUGADORES_HISTORICO(IdJugador,IdEquipo,Temporada,IdEstadisticas)
     VALUES(@idjugador,@idEquipo,@temporada,@idEst)
END

  • El código que hemos añadido a nuestra aplicación de consola para poder efectuar el guardado de datos en nuestra base de datos es este:
  static void guardarEstadisticasugadoresRetirados()
        {

            SqlConnection conexion = null;


            DirectoryInfo directorio = new DirectoryInfo(@"D:\JugadoresNBA\");
            FileInfo[] archivos = directorio.GetFiles();
            String linea = String.Empty;
            int cont = 0;
            string jugador = String.Empty;
            string temporada = String.Empty;
            string equipo = String.Empty;
            string Pjugados = String.Empty;
            string minutos = String.Empty;
            string puntos = String.Empty;
            string rebotes = String.Empty;
            string tapones = String.Empty;
            string asistencias = String.Empty;
            string robos = String.Empty;
            bool totalCArrera = false;
            Boolean tieneTemporadas = false;
            foreach (FileInfo archivo in archivos)
            {
              
                HtmlDocument doc = new HtmlDocument();
                HtmlNode.ElementsFlags["br"] = HtmlElementFlag.Empty;
                doc.OptionWriteEmptyNodes = true;
                doc.Load(archivo.FullName);

                string selector = "//table[@class='tablehead']//tr";
                HtmlNodeCollection nodoColecion = doc.DocumentNode.SelectNodes(selector);

                //Comprobamos si el fichero contiene lel texto Last 5 Games.Si no contiene esto es un jugador retirado
                if (nodoColecion != null && !doc.Text.Contains("Last 5 Games") && !doc.Text.Contains("OPP") && !doc.Text.Contains("Postseason") )
                {
                    foreach (HtmlNode nodo in nodoColecion)
                    {
                        if (!nodo.InnerText.Contains("STATS") && !nodo.InnerText.Contains("SEASON"))
                        {
                            conexion = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString());
                            try
                            {
                             
                                cont++;
                                if (!nodo.InnerText.Contains("Career") && !nodo.InnerHtml.Contains("<th>"))
                                {
                                    Console.WriteLine(cont.ToString());
                                    Console.WriteLine();
                                    jugador = archivo.Name.Substring(0, archivo.Name.Length - 5);
                                    Console.WriteLine(jugador);
                                    temporada = nodo.ChildNodes[0].InnerText;
                                    Console.WriteLine(temporada);
                                    equipo = nodo.ChildNodes[1].InnerText;
                                    Console.WriteLine(equipo);
                                    Pjugados = nodo.ChildNodes[2].InnerText;
                                    Console.WriteLine(Pjugados);
                                    minutos = nodo.ChildNodes[4].InnerText;
                                    Console.WriteLine(minutos);
                                    puntos = nodo.ChildNodes[19].InnerText;
                                    Console.WriteLine(puntos);
                                    rebotes = nodo.ChildNodes[13].InnerText;
                                    Console.WriteLine(rebotes);
                                    tapones = nodo.ChildNodes[15].InnerText;
                                    Console.WriteLine(tapones);
                                    asistencias = nodo.ChildNodes[14].InnerText;
                                    Console.WriteLine(asistencias);
                                    robos = nodo.ChildNodes[16].InnerText;
                                    Console.WriteLine(robos);
                                    Console.WriteLine();
                                    totalCArrera = false;
                                    tieneTemporadas = true;
                                }
                                else if (tieneTemporadas)
                                {
                                    totalCArrera = true;
                                    Console.WriteLine(cont.ToString());
                                    Console.WriteLine();
                                    jugador = archivo.Name.Substring(0, archivo.Name.Length - 5);
                                    Console.WriteLine(jugador);
                                    temporada = nodo.ChildNodes[0].InnerText;
                                    Console.WriteLine(temporada);
                                    equipo = "RESUMEN CARRERA";
                                    Console.WriteLine(equipo);
                                    Pjugados = nodo.ChildNodes[1].InnerText;
                                    Console.WriteLine(Pjugados);
                                    minutos = nodo.ChildNodes[3].InnerText;
                                    Console.WriteLine(minutos);
                                    puntos = nodo.ChildNodes[18].InnerText;
                                    Console.WriteLine(puntos);
                                    rebotes = nodo.ChildNodes[12].InnerText;
                                    Console.WriteLine(rebotes);
                                    tapones = nodo.ChildNodes[14].InnerText;
                                    Console.WriteLine(tapones);
                                    asistencias = nodo.ChildNodes[13].InnerText;
                                    Console.WriteLine(asistencias);
                                    robos = nodo.ChildNodes[15].InnerText;
                                    Console.WriteLine(robos);
                                    Console.WriteLine();
                                    totalCArrera = true;
                                    tieneTemporadas = false;
                                }


                                conexion.Open();

                                SqlCommand Comm = conexion.CreateCommand();
                                Comm.CommandText = "dbo.GuardarEstadisticasJugadorNBA";
                                Comm.CommandType = CommandType.StoredProcedure;
                                Comm.Parameters.Add("@Jugador", SqlDbType.VarChar, 500).Value = jugador;
                                Comm.Parameters.Add("@Equipo", SqlDbType.VarChar, 50).Value = equipo;
                                Comm.Parameters.Add("@temporada", SqlDbType.VarChar, 50).Value = temporada;
                                Comm.Parameters.Add("@Pjugados", SqlDbType.Int).Value = Pjugados;
                                Comm.Parameters.Add("@Minutos", SqlDbType.Float).Value = minutos.Replace('.', ',');
                                Comm.Parameters.Add("@Puntos", SqlDbType.Float).Value = puntos.Replace('.',',');
                                Comm.Parameters.Add("@rebotes", SqlDbType.Float).Value = rebotes.Replace('.', ',');
                                Comm.Parameters.Add("@tapones", SqlDbType.Float).Value = tapones.Replace('.', ',');
                                Comm.Parameters.Add("@asistencias", SqlDbType.Float).Value = asistencias.Replace('.', ',');
                                Comm.Parameters.Add("@robos", SqlDbType.Float).Value = robos.Replace('.', ',');
                                Comm.Parameters.Add("@totCArrera", SqlDbType.Bit).Value = totalCArrera;
                                Comm.ExecuteNonQuery();

                            }


                            catch (Exception ex)
                            {
                                Console.WriteLine(ex.ToString());
                                Console.ReadLine();


                            }
                            finally
                            {
                                conexion.Close();
                                conexion.Dispose();
                            }
                        }


                    }

                }

            }

            Console.WriteLine("Operacion completada");
            Console.ReadLine();
        }

Bot web Scraping - Web ESPN - Parte 7

7. Web Scraping de la página ESPN

  •  En este capítulo del curso de programación en c# con visual studio 2017 guardaremos los datos de los jugadores en nuestra base de datos llamando a un procedimiento almacenado desde nuestra aplicación de consola.Os dejo nuestro diseño de tablas:

  • Para poder guardar los datos necesarios en la tabla jugadores necesitamos obtenerlos de los ficheros que tenemos almacenados en nuestro disco duro.Para ello tenemos que ver de que manera obtener los datos. Os lo cuento en el vídeo:


  • Os dejo los métodos vistos en el vídeo:
        static void guardarDatosJugadores()
        {
            SqlConnection conexion = null;


            DirectoryInfo directorio = new DirectoryInfo(@"D:\JugadoresNBA\");
            FileInfo[] archivos = directorio.GetFiles();
            String linea = String.Empty;
            int cont = 0;
            foreach (FileInfo archivo in archivos)
            {
                Jugador j = new Jugador();
                HtmlDocument doc = new HtmlDocument();
                HtmlNode.ElementsFlags["br"] = HtmlElementFlag.Empty;
                doc.OptionWriteEmptyNodes = true;
                doc.Load(archivo.FullName);

                string selector = "//ul[@class='general-info']";
                HtmlNodeCollection nodoColecion = doc.DocumentNode.SelectNodes(selector);



                if (nodoColecion != null)
                {
                    foreach (HtmlNode nodo in nodoColecion)
                    {
                        conexion = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString());
                        try
                        {

                            cont++;
                            Console.WriteLine(cont.ToString());
                            Console.WriteLine();
                            j.Nombre = archivo.Name.Substring(0, archivo.Name.Length - 5);
                            DameDatosFisicos("//ul[@class='general-info']//li", doc, ref j);
                            Console.WriteLine(j.Nombre);
                            Console.WriteLine(j.Posicion);

                            if (j.Posicion.Contains("#"))
                                j.EnActivo = true;
                            else
                                j.EnActivo = false;

                            Console.WriteLine(j.Peso.ToString());
                            Console.WriteLine(j.Altura.ToString());
                            DameDatosExperiencia("//ul[@class='player-metadata floatleft']//li", doc, ref j);
                            Console.WriteLine(j.AnyiosActivo.ToString());


                             conexion.Open();

                             SqlCommand Comm = conexion.CreateCommand();
                             Comm.CommandText = "dbo.GuardarJugadorNBA";
                             Comm.CommandType = CommandType.StoredProcedure;
                             Comm.Parameters.Add("@Jugador", SqlDbType.VarChar, 500).Value = j.Nombre;
                             Comm.Parameters.Add("@Poscion", SqlDbType.VarChar, 50).Value = j.Posicion;
                             Comm.Parameters.Add("@altura", SqlDbType.VarChar, 50).Value = j.Altura;
                             Comm.Parameters.Add("@Peso", SqlDbType.Int).Value =j.Peso;
                             Comm.Parameters.Add("@anyio", SqlDbType.Int).Value = j.AnyiosActivo;
                             Comm.Parameters.Add("@enactivo", SqlDbType.Bit).Value = j.EnActivo;
                              Comm.ExecuteNonQuery();
                        }

                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.ToString());
                            Console.ReadLine();


                        }
                        finally
                        {
                            conexion.Close();
                            conexion.Dispose();
                        }


                    }

                }

            }

            Console.WriteLine("Operacion completada");
            Console.ReadLine();
        }

     static void DameDatosFisicos(string selector, HtmlDocument doc, ref Jugador j)
        {

            HtmlNodeCollection nodoColecion = doc.DocumentNode.SelectNodes(selector);
            if (nodoColecion != null)
            {
                //vienen dos lineas una para la posición y otra para el peso y la ultura
                if (nodoColecion.Count == 2)
                    foreach (HtmlNode nodo in nodoColecion)
                    {
                        if (j.Posicion == String.Empty)
                            j.Posicion = nodo.InnerText;
                        else if (j.Peso == 0)
                        {
                            string[] x = nodo.InnerText.Split(',');
                            if (x.Length > 0)
                            {
                                string altura = x[0].Replace("\"", "").Replace("'", ".").Replace(" ", "");
                                j.Altura = altura;
                                if (x.Length > 1)
                                    j.Peso = Convert.ToInt32(Convert.ToInt32(x[1].Replace("lbs", "").Trim()) * 0.453592);
                            }
                        }
                    }
                else if (nodoColecion.Count == 3)
                {
                    int cont = 0;
                    foreach (HtmlNode nodo in nodoColecion)
                    {
                        cont++;
                        if (j.Posicion == String.Empty)
                            j.Posicion = nodo.InnerText;
                        else if (j.Peso == 0 && cont == 2)
                        {
                            string[] x = nodo.InnerText.Split(',');
                            string altura = x[0].Replace("\"", "").Replace("'", ".").Replace(" ", "");

                            j.Altura = altura;
                            if (x.Length > 1)
                                j.Peso = Convert.ToInt32(Convert.ToInt32(x[1].Replace("lbs", "").Trim()) * 0.453592);
                        }
                    }
                }
            }


        }
        static void DameDatosExperiencia(string selector, HtmlDocument doc, ref Jugador j)
        {
            HtmlNodeCollection nodoColecion = doc.DocumentNode.SelectNodes(selector);
            if (nodoColecion != null)
            {
                int cont = 0;
                foreach (HtmlNode nodo in nodoColecion)
                {

                    cont++;
                    if (cont == 4 && nodo.InnerText.Contains("year"))
                        j.AnyiosActivo = Convert.ToInt32(nodo.InnerText.Replace("Experience", "").Replace("years", "").Replace("year","").Trim()); 
                }
            }

        }

Bot web Scraping - Web ESPN - Parte 6

6. Web Scraping de la página ESPN

  •  En este capítulo del curso de programación en c# con visual studio 2017 guardaremos los equipos en nuestra base de datos llamando a un procedimiento almacenado desde nuestra aplicación de consola.Os dejo nuestro diseño de tablas:

  • Para poder guardar los datos también veremos como leerlos de una manera fácil de los fichero que tenemos almacenados. En el vídeo os lo cuento con más detalle:
  • Os dejo el procedimiento almacenado utilizado en el vídeo para almacenar los equipos:

CREATE PROCEDURE [dbo].[GuardarEquiposNBA](
@Equipo varchar(500),
@Acrononimo varchar(50)
)
AS
BEGIN

SET NOCOUNT ON;


IF(SELECT count(*) FROM  EQUIPOS where Acronimo=@Acrononimo)=0
BEGIN
INSERT INTO dbo.EQUIPOS(Equipo,Acronimo) VALUES(@Equipo,@Acrononimo)
END
END


  • Código utilizado para guardar los equipos en la base de datos:
   static void guardarEquipos()
        {

            SqlConnection conexion = null;
    

            DirectoryInfo directorio = new DirectoryInfo(@"D:\JugadoresNBA\");
            FileInfo[] archivos = directorio.GetFiles();
            String linea = String.Empty;

            foreach (FileInfo archivo in archivos)
            {
                HtmlDocument doc = new HtmlDocument();
                HtmlNode.ElementsFlags["br"] = HtmlElementFlag.Empty;
                doc.OptionWriteEmptyNodes = true;
                doc.Load(archivo.FullName);

                string selector = "//li[@class='team-name']";
                HtmlNodeCollection nodoColecion = doc.DocumentNode.SelectNodes(selector);

                if (nodoColecion != null)
                {
                    foreach (HtmlNode nodo in nodoColecion)
                    {
                        conexion = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString());
                        try
                        {
                          
                            conexion.Open();

                            SqlCommand Comm = conexion.CreateCommand();
                            Comm.CommandText = "dbo.GuardarEquiposNBA";
                            Comm.CommandType = CommandType.StoredProcedure;
                            Comm.Parameters.Add("@Equipo", SqlDbType.VarChar, 500).Value = dameEquipo(nodo.InnerText.ToUpper());
                            Comm.Parameters.Add("@Acrononimo", SqlDbType.VarChar, 50).Value = nodo.InnerText;
                            Comm.ExecuteNonQuery();
                           
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.ToString());
                            Console.ReadLine();


                        }
                        finally
                        {
                            conexion.Close();
                            conexion.Dispose();
                        }


                    }

                }


            }
            Console.WriteLine("Operacion completada");
            Console.ReadLine();


        }

        static string dameEquipo(string equipo)
        {
            string equipoCompleto = String.Empty;
            switch (equipo)
            {
                case "BOS":
                    equipoCompleto = "Boston Celtics";
                    break;
                case "BKN":
                    equipoCompleto = "Brooklyn Nets";
                    break;
                case "NY":
                    equipoCompleto = "New York Knicks";
                    break;
                case "PHI":
                    equipoCompleto = "Philadelphia 76ers";
                    break;
                case "TOR":
                    equipoCompleto = "Toronto Raptors";
                    break;
                case "CHI":
                    equipoCompleto = "Chicago Bulls";
                    break;
                case "CLE":
                    equipoCompleto = "Cleveland Cavaliers";
                    break;
                case "DET":
                    equipoCompleto = "Detroit Pistons";
                    break;
                case "IND":
                    equipoCompleto = "Indiana Pacers";
                    break;
                case "MIL":
                    equipoCompleto = "Milwaukee Bucks";
                    break;
                case "DEN":
                    equipoCompleto = "Denver Nuggets";
                    break;
                case "MIN":
                    equipoCompleto = "Minnesota Timberwolves";
                    break;
                case "OKC":
                    equipoCompleto = "Oklahoma City Thunder";
                    break;
                case "POR":
                    equipoCompleto = "Portland Trail Blazers";
                    break;
                case "UTAH":
                    equipoCompleto = "Utah Jazz";
                    break;
                case "GS":
                    equipoCompleto = "Golden State Warriors";
                    break;
                case "LAC":
                    equipoCompleto = "LA Clippers";
                    break;
                case "LAL":
                    equipoCompleto = "Los Angeles Lakers";
                    break;
                case "SAC":
                    equipoCompleto = "Sacramento Kings";
                    break;
                case "PHX":
                    equipoCompleto = "Phoenix Suns";
                    break;
                case "ATL":
                    equipoCompleto = "Atlanta Hawks";
                    break;
                case "CHA":
                    equipoCompleto = "Charlotte Hornets";
                    break;
                case "MIA":
                    equipoCompleto = "Miami Heat";
                    break;
                case "ORL":
                    equipoCompleto = "Orlando Magic";
                    break;
                case "WSH":
                    equipoCompleto = "Washington Wizards";
                    break;
                case "DAL":
                    equipoCompleto = "Dallas Mavericks";
                    break;
                case "HOU":
                    equipoCompleto = "Houston Rockets";
                    break;
                case "MEM":
                    equipoCompleto = "Memphis Grizzlies";
                    break;
                case "NO":
                    equipoCompleto = "New Orleans Pelicans";
                    break;
                case "SA":
                    equipoCompleto = "San Antonio Spurs";
                    break;
                case "NJ":
                    equipoCompleto = "New Jersey Nets";
                    break;
                case "VAN":
                    equipoCompleto = "Vancover Grizlies";
                    break;
                case "SEA":
                    equipoCompleto = "Seattle";
                    break;
                default:
                  break;
            }
            return equipoCompleto;
          }

    }

Bot web Scraping - Web ESPN - Parte 5

5. Web Scraping de la página ESPN

  •  En este capítulo del curso de programación en c# con visual studio 2017, empezaremos a preparar el entorno para poder guardar en nuestra base de datos los ficheros que tenemos almacenados en nuestro disco.Obtenidos previamente de la página de la ESPN. 
  • Recordar que en esta base de datos guardaremos algunos de los datos obtenidos para luego consultarlos en una aplicación que nos de las estadísticas que nosotros queramos consultar.De momento en este vídeo os cuento las modificaciones que he hecho  en nuestra aplicación para convertirlo en un aplicación con un menú que nos permita elegir entre varias opciones.Además dejo preparado el programa para ir leyendo los casi 2000 fichero que tenemos almacenados.
  • En el vídeo os lo cuento con más detalle:



  • Os dejo el código visto en el vídeo:

  1. Método con el que presentamos el menú en pantalla al usuario:
 static void Menu()
        {

            char opcion;



            do
            {
                Console.Clear();
                Console.WriteLine("\t************************************************");
                Console.WriteLine("\t  1- Recopilar datos              ");
                Console.WriteLine("\t  2- Guardar equipos                 ");
                Console.WriteLine("\t  0- Salir             ");
                Console.WriteLine("\t************************************************");
                Console.Write("Opcion: ");
                do
                {
                    opcion = Console.ReadKey(true).KeyChar;
                } while (opcion < '0' || opcion > '8');
                Console.WriteLine(opcion + "\n");

                switch (opcion)
                {
                    case '1':
                        try
                        {
                            recopilarDatos();
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.ToString());
                        }
                        break;
                    case '2':
                        try
                        {
                            guardarEquipos();
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.ToString());
                            Console.ReadLine();
                        }
                        break;



                }


            } while (opcion != '0');
        }

2. Método que recorre los fichero en una ruta determinada:

   static void guardarEquipos()
        {
            DirectoryInfo directorio = new DirectoryInfo(@"D:\JugadoresNBA\");
            FileInfo[] archivos = directorio.GetFiles();
            String linea = String.Empty;

            foreach (FileInfo archivo in archivos)
            {
                StreamReader file = new StreamReader(archivo.FullName);
                while ((linea = file.ReadLine()) != null)
                {
                   //TRATAR LOS DATOS System.Console.WriteLine(linea);

                }

                file.Close();
            }


        }

Curso .NET Core en C# - 34.Creamos nuestro propio log

34.Creamos nuestro propio log Hola a todos. En este curso, analizaremos todos los conceptos básicos, intermedios y avanzados de  ASP.NET...