{"id":908,"date":"2024-05-06T10:15:55","date_gmt":"2024-05-06T08:15:55","guid":{"rendered":"https:\/\/arter-demo.bslthemes.com\/?p=148"},"modified":"2026-10-05T08:15:54","modified_gmt":"2026-10-05T06:15:54","slug":"guia-requests-beautifulsoup","status":"publish","type":"post","link":"https:\/\/germanmallo.com\/en\/guia-requests-beautifulsoup\/","title":{"rendered":"Gu\u00eda de Requests y BeautifulSoup en Python"},"content":{"rendered":"<p style=\"text-align: justify\">En esta gu\u00eda comparto c\u00f3mo aprend\u00ed a utilizar las bibliotecas Requests y BeautifulSoup en Python para realizar solicitudes HTTP y hacer web scrapping para analizar el contenido de una p\u00e1gina web.<\/p>\n<h2 id=\"introducci-n\" style=\"text-align: justify\">Introducci\u00f3n<\/h2>\n<p style=\"text-align: justify\"><strong>Requests<\/strong> es una biblioteca de Python que permite realizar solicitudes HTTP de manera sencilla y eficiente. Por otro lado, <strong>BeautifulSoup<\/strong> es una biblioteca que facilita el an\u00e1lisis y extracci\u00f3n de datos de documentos HTML y XML.<\/p>\n<h2 id=\"instalaci-n\" style=\"text-align: justify\">Instalaci\u00f3n<\/h2>\n<p style=\"text-align: justify\">Para utilizar Requests y BeautifulSoup, primero debes instalarlas. Puedes hacerlo ejecutando los siguientes comandos en tu terminal:<\/p>\n<pre><code>```bash\npip install requests\npip install bs4\n```\n<\/code><\/pre>\n<h2 id=\"librer-a-requests\" style=\"text-align: justify\">Librer\u00eda Requests<\/h2>\n<h3 id=\"realizar-una-solicitud-http\" style=\"text-align: justify\">Realizar una solicitud HTTP<\/h3>\n<p style=\"text-align: justify\">Con el modulo Requests, usamos el m\u00e9todo <code>get()<\/code> para obtener el contenido de una p\u00e1gina web. Por ejemplo, para obtener el contenido de la p\u00e1gina de Wikipedia en espa\u00f1ol, podemos ejecutar el siguiente c\u00f3digo:<\/p>\n<pre><code>```python\n<span class=\"hljs-keyword\">import<\/span> requests\n\nresponse = requests.get(<span class=\"hljs-string\">'https:\/\/es.wikipedia.org\/wiki\/Wikipedia:Portada'<\/span>)\n```\n<\/code><\/pre>\n<p style=\"text-align: justify\">En este caso, obtendremos un objeto de tipo <code>Response<\/code> que contiene el contenido de la p\u00e1gina web. Para acceder al contenido, podemos utilizar el atributo <code>text<\/code>:<\/p>\n<pre><code>```python\nprint(response.text)\n```\n<\/code><\/pre>\n<p style=\"text-align: justify\">Y as\u00ed obtendremos el contenido de la p\u00e1gina web en formato de texto plano.<\/p>\n<p style=\"text-align: justify\">Para obtener el c\u00f3digo de estado de la respuesta HTTP, podemos utilizar el atributo <code>status_code<\/code>:<\/p>\n<pre><code>```python\n<span class=\"hljs-keyword\">print<\/span>(response.status_code)\n```\nUn peque\u00f1o apunte: los c\u00f3digos <span class=\"hljs-keyword\">de<\/span> estado <span class=\"hljs-keyword\">de<\/span> las respuestas HTTP indican si una solicitud HTTP <span class=\"hljs-keyword\">se<\/span> ha completado satisfactoriamente. Por ejemplo, el c\u00f3digo <span class=\"hljs-keyword\">de<\/span> estado `200` indica <span class=\"hljs-keyword\">que<\/span> <span class=\"hljs-keyword\">la<\/span> solicitud <span class=\"hljs-keyword\">se<\/span> ha completado correctamente, mientras <span class=\"hljs-keyword\">que<\/span> el c\u00f3digo <span class=\"hljs-keyword\">de<\/span> estado `404` indica <span class=\"hljs-keyword\">que<\/span> <span class=\"hljs-keyword\">la<\/span> p\u00e1gina web <span class=\"hljs-keyword\">no<\/span> ha sido encontrada.\n<\/code><\/pre>\n<p style=\"text-align: justify\">Tambi\u00e9n podemos obtener los encabezados de la respuesta HTTP utilizando el atributo <code>headers<\/code>:<\/p>\n<pre><code>```python\nprint(response.headers)\n```\n<\/code><\/pre>\n<p style=\"text-align: justify\">Y as\u00ed obtendremos un diccionario con los encabezados de la respuesta HTTP.<\/p>\n<p style=\"text-align: justify\">Para utilizar el contenido de la pagina en cuesti\u00f3n como una variable, podemos utilizar el m\u00e9todo <code>content<\/code>:<\/p>\n<pre><code>```python\ncontent = response.content\n```\n<\/code><\/pre>\n<p style=\"text-align: justify\">Este m\u00e9todo, lo que hace exactamente es codificar el contenido de la p\u00e1gina web en formato binario.<\/p>\n<p style=\"text-align: justify\">Una vez tengamos el contenido de la p\u00e1gina web almacenado en una variable, podemos utilizar la librer\u00eda BeautifulSoup para parsear el contenido y extraer la informaci\u00f3n que nos interese.<\/p>\n<h2 id=\"librer-a-beautifulsoup\" style=\"text-align: justify\">Librer\u00eda BeautifulSoup<\/h2>\n<h3 id=\"parsear-el-contenido-de-una-p-gina-web\" style=\"text-align: justify\">Parsear el contenido de una p\u00e1gina web<\/h3>\n<p style=\"text-align: justify\">Para utilizar BeautifulSoup, primero debemos importarla:<\/p>\n<pre><code>```python\n<span class=\"hljs-keyword\">from<\/span> bs4 <span class=\"hljs-keyword\">import<\/span> BeautifulSoup\n```\n<\/code><\/pre>\n<p style=\"text-align: justify\">Una vez importada, podemos crear un objeto de tipo <code>BeautifulSoup<\/code> a partir del contenido de la p\u00e1gina web:<\/p>\n<pre><code>```<span class=\"hljs-keyword\">python<\/span>\nsoup = BeautifulSoup(content, <span class=\"hljs-string\">'lxml'<\/span>)\n```\nPAR\u00c1METRO CONTENT: contenido de <span class=\"hljs-keyword\">la<\/span> <span class=\"hljs-keyword\">p<\/span>\u00e1gina web <span class=\"hljs-keyword\">en<\/span> formato binario.\nPAR\u00c1METRO <span class=\"hljs-string\">'lxml'<\/span>: especifica <span class=\"hljs-keyword\">el<\/span> analizador que <span class=\"hljs-keyword\">se<\/span> utilizar\u00e1 para parsear <span class=\"hljs-keyword\">el<\/span> contenido de <span class=\"hljs-keyword\">la<\/span> <span class=\"hljs-keyword\">p<\/span>\u00e1gina web. En este caso, utilizaremos <span class=\"hljs-keyword\">el<\/span> analizador lxml, pero tambi\u00e9n podr\u00edamos utilizar <span class=\"hljs-keyword\">el<\/span> analizador html.parser\n<\/code><\/pre>\n<p style=\"text-align: justify\">Ahora que tenemos el contenido de la p\u00e1gina web parseado, podemos utilizar los m\u00e9todos de BeautifulSoup para extraer la informaci\u00f3n que nos interese.<\/p>\n<h3 id=\"m-todos-de-beautifulsoup\" style=\"text-align: justify\">M\u00e9todos de BeautifulSoup<\/h3>\n<h4 id=\"-soup-title-\" style=\"text-align: justify\"><strong><code>soup.title<\/code><\/strong><\/h4>\n<p style=\"text-align: justify\">Usaremos los m\u00e9todos de BeautifulSoup para extraer la informaci\u00f3n que nos interese de la p\u00e1gina web. Por ejemplo, para obtener el t\u00edtulo de la p\u00e1gina web, podemos utilizar el m\u00e9todo <code>title<\/code>:<\/p>\n<pre><code>```python\nprint(soup.title)\n```\nEl m\u00e9todo title nos devuelve el t\u00edtulo de la p\u00e1gina web, incluyendo las etiquetas HTML.\n<\/code><\/pre>\n<h4 id=\"-soup-find-y-soup-find_all-\" style=\"text-align: justify\"><strong><code>soup.find()<\/code> y <code>soup.find_all()<\/code><\/strong><\/h4>\n<p style=\"text-align: justify\">Otro m\u00e9todo muy \u00fatil de BeautifulSoup es <code>find()<\/code> y <code>find_all()<\/code>. Estos m\u00e9todos nos permiten buscar elementos HTML en el contenido de la p\u00e1gina web.<\/p>\n<p style=\"text-align: justify\">En el siguiente ejemplo, utilizaremos el m\u00e9todo <code>find_all()<\/code> para obtener todos los enlaces de la p\u00e1gina web:<\/p>\n<pre><code class=\"lang-python\">links = soup.find_all(<span class=\"hljs-string\">\"a\"<\/span>) <span class=\"hljs-selector-id\">#links<\/span> es una lista de enlaces\n<span class=\"hljs-function\"><span class=\"hljs-title\">print<\/span><span class=\"hljs-params\">(<span class=\"hljs-string\">'print(soup.find_all(\"a\"))'<\/span>)<\/span><\/span>\n<span class=\"hljs-function\"><span class=\"hljs-title\">print<\/span><span class=\"hljs-params\">(links)<\/span><\/span>\n<span class=\"hljs-function\"><span class=\"hljs-title\">print<\/span><span class=\"hljs-params\">(<span class=\"hljs-string\">\"\\n\"<\/span>)<\/span><\/span>\n<\/code><\/pre>\n<p style=\"text-align: justify\">Peque\u00f1o apunte: para identificar los enlaces en HTML se utiliza la etiqueta <a>, es por eso por lo que utilizamos el par\u00e1metro \u00aba\u00bb en el m\u00e9todo find_all().<\/a><\/p>\n<h4 id=\"-soup-prettify-\" style=\"text-align: justify\"><strong><code>soup.prettify()<\/code><\/strong><\/h4>\n<p style=\"text-align: justify\">Para imprimir el contenido de la p\u00e1gina web de una manera m\u00e1s legible, podemos utilizar el m\u00e9todo <code>prettify()<\/code>:<\/p>\n<pre><code class=\"lang-python\">print(<span class=\"hljs-name\">soup<\/span>.prettify())\n<\/code><\/pre>\n<p style=\"text-align: justify\">El m\u00e9todo prettify() nos devuelve el contenido de la p\u00e1gina web con una estructura de \u00e1rbol, lo que hace que sea m\u00e1s f\u00e1cil de leer.<\/p>\n<h3 id=\"-diferencias-entre-response-text-beautifulsoup-response-text-lxml-y-soup-prettify-\" style=\"text-align: justify\"><strong>Diferencias entre <code>response.text<\/code>, <code>BeautifulSoup(response.text, 'lxml')<\/code> y <code>soup.prettify()<\/code>.<\/strong><\/h3>\n<pre><code class=\"lang-python\"><span class=\"hljs-built_in\">import<\/span> requests\nfrom bs4 <span class=\"hljs-built_in\">import<\/span> BeautifulSoup\n\n<span class=\"hljs-attr\">response<\/span> = requests.get('https:\/\/es.wikipedia.org\/wiki\/Wikipedia:Portada')\n<span class=\"hljs-attr\">content<\/span> = response.content\n<span class=\"hljs-attr\">soup<\/span> = BeautifulSoup(content, 'lxml')\n<span class=\"hljs-attr\">prettify<\/span> = soup.prettify()\n<\/code><\/pre>\n<ul style=\"text-align: justify\">\n<li><strong>RESPONSE:<\/strong> El m\u00e9todo text nos devuelve el contenido de la p\u00e1gina web en formato de texto plano.<\/li>\n<li><strong>SOUP:<\/strong> Cuando hacemos BeautifulSoup(response.text, &#8216;lxml&#8217;), lo que hacemos es crear un objeto de tipo BeautifulSoup a partir del contenido de la p\u00e1gina web en formato de texto plano. Este objeto es (internamente) como una especie de \u00e1rbol que contiene todos los elementos HTML de la p\u00e1gina web estructurados a su manera.<\/li>\n<li><strong>PRETTIFY:<\/strong> El m\u00e9todo prettify() nos devuelve el soup con una estructura de \u00e1rbol. B\u00e1sicamente hace que podamos entender mejor la estructura del objeto BeautifulSoup, identando el texto y a\u00f1adiendo saltos de l\u00ednea seg\u00fan la estructura del \u00e1rbol.<\/li>\n<\/ul>\n<h4 id=\"-ejemplo-pr-ctico-\" style=\"text-align: justify\"><strong>Ejemplo pr\u00e1ctico<\/strong><\/h4>\n<p style=\"text-align: justify\">Para continuar con el ejemplo y recapitular un poco lo que hemos visto hasta ahora, vamos a buscar todos los enlaces que contengan la cadena \u00abacerca de\u00bb en la p\u00e1gina principal de google:<\/p>\n<pre><code class=\"lang-python\"><span class=\"hljs-keyword\">import<\/span> requests\n<span class=\"hljs-keyword\">from<\/span> bs4 <span class=\"hljs-keyword\">import<\/span> BeautifulSoup\n\nresult = requests.get(<span class=\"hljs-string\">\"https:\/\/www.google.com\/\"<\/span>)\n<span class=\"hljs-built_in\">print<\/span>(result.status_code) <span class=\"hljs-comment\"># 200, es correcto<\/span>\n\nsrc = result.content <span class=\"hljs-comment\"># contenido de la p\u00e1gina web en formato binario<\/span>\nsoup = BeautifulSoup(src, <span class=\"hljs-string\">'lxml'<\/span>) <span class=\"hljs-comment\"># parseamos el contenido de la p\u00e1gina web<\/span>\n\nlinks = soup.find_all(<span class=\"hljs-string\">\"a\"<\/span>) <span class=\"hljs-comment\"># buscamos todos los enlaces de la p\u00e1gina web<\/span>\n<span class=\"hljs-keyword\">for<\/span> link <span class=\"hljs-keyword\">in<\/span> links: <span class=\"hljs-comment\"># por cada enlace en la lista de enlaces<\/span>\n    <span class=\"hljs-keyword\">if<\/span> <span class=\"hljs-string\">\"Acerca de\"<\/span> <span class=\"hljs-keyword\">in<\/span> link.text:\n        <span class=\"hljs-built_in\">print<\/span>(link) <span class=\"hljs-comment\"># imprimimos el enlace<\/span>\n        <span class=\"hljs-built_in\">print<\/span>(<span class=\"hljs-string\">\\n)<\/span> <span class=\"hljs-comment\"># imprimimos un salto de l\u00ednea<\/span>\n        <span class=\"hljs-built_in\">print<\/span>(link.attrs[<span class=\"hljs-string\">'href'<\/span>]) <span class=\"hljs-comment\"># obtenemos el valor del  atributo href<\/span>\n<\/code><\/pre>\n<p style=\"text-align: justify\">Peque\u00f1o apunte: para obtener el valor de un atributo HTML, podemos utilizar el m\u00e9todo <code>attrs<\/code> y especificar el nombre del atributo que queremos obtener. En este caso, queremos obtener el valor del atributo <code>href<\/code>, que contiene la URL del enlace.<\/p>\n<h3 id=\"atributos-de-los-elementos-html\" style=\"text-align: justify\">Atributos de los elementos HTML<\/h3>\n<p style=\"text-align: justify\">Los atributos de los elementos HTML son pares de valores que se utilizan para configurar el comportamiento de los elementos HTML. Por ejemplo, el atributo <code>href<\/code> se utiliza para especificar la URL de un enlace. A continuaci\u00f3n veremos los atributos m\u00e1s comunes:<\/p>\n<p style=\"text-align: justify\">Primero, si queremos observar todos los atributos de un elemento HTML, podemos utilizar el m\u00e9todo <code>attrs<\/code>:<\/p>\n<pre><code class=\"lang-python\">link = soup.find(<span class=\"hljs-string\">\"a\"<\/span>)\n<span class=\"hljs-function\"><span class=\"hljs-title\">print<\/span><span class=\"hljs-params\">(link.attrs)<\/span><\/span>\n<\/code><\/pre>\n<p style=\"text-align: justify\">Esto nos mostrar\u00e1 un diccionario con todos los atributos del elemento HTML.<\/p>\n<h4 id=\"-href-\" style=\"text-align: justify\"><code>href<\/code><\/h4>\n<p style=\"text-align: justify\">Este ya lo hemos visto antes, se utiliza para especificar la URL de un enlace.<\/p>\n<pre><code class=\"lang-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"https:\/\/www.google.com\/\"<\/span>&gt;<\/span>Google<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span>\n<\/code><\/pre>\n<p style=\"text-align: justify\">Para obtener el valor de cualquier atributo HTML en python, usaremos el m\u00e9todo <code>attrs<\/code> y especificaremos el nombre del atributo que queremos obtener:<\/p>\n<pre><code class=\"lang-python\">link = soup.<span class=\"hljs-built_in\">find<\/span>(<span class=\"hljs-string\">\"a\"<\/span>)\n<span class=\"hljs-built_in\">print<\/span>(link.attrs[<span class=\"hljs-string\">'href'<\/span>]) <span class=\"hljs-meta\"># https:<span class=\"hljs-comment\">\/\/www.google.com\/<\/span><\/span>\n<\/code><\/pre>\n<h4 id=\"-id-\" style=\"text-align: justify\"><code>id<\/code><\/h4>\n<p style=\"text-align: justify\">Se utiliza para especificar un identificador \u00fanico para un elemento HTML.<\/p>\n<pre><code class=\"lang-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"parrafo\"<\/span>&gt;<\/span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n<\/code><\/pre>\n<p style=\"text-align: justify\">De la misma forma que anteriormente, con python obtendremos el valor del atributo <code>id<\/code> de la siguiente manera:<\/p>\n<pre><code class=\"lang-python\">p = soup.<span class=\"hljs-built_in\">find<\/span>(<span class=\"hljs-string\">\"p\"<\/span>)\n<span class=\"hljs-built_in\">print<\/span>(p.attrs[<span class=\"hljs-string\">'id'<\/span>]) <span class=\"hljs-meta\"># parrafo<\/span>\n<\/code><\/pre>\n<h4 id=\"-src-\" style=\"text-align: justify\"><code>src<\/code><\/h4>\n<p style=\"text-align: justify\">Se utiliza para especificar la URL de una imagen.<\/p>\n<pre><code class=\"lang-html\">&lt;<span class=\"hljs-selector-tag\">img<\/span> src=<span class=\"hljs-string\">\"https:\/\/germanmallo.com\/wp-content\/uploads\/2024\/05\/googlelogo_color_272x92dp.png\"<\/span>&gt;\n<\/code><\/pre>\n<pre><code class=\"lang-python\">img = soup.<span class=\"hljs-built_in\">find<\/span>(<span class=\"hljs-string\">\"img\"<\/span>)\n<span class=\"hljs-built_in\">print<\/span>(img.attrs[<span class=\"hljs-string\">'src'<\/span>]) <span class=\"hljs-meta\"># https:<span class=\"hljs-comment\">\/\/www.google.com\/images\/branding\/googlelogo\/1x\/googlelogo_color_272x92dp.png<\/span><\/span>\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En esta gu\u00eda comparto c\u00f3mo aprend\u00ed a utilizar las bibliotecas Requests y BeautifulSoup en Python para realizar solicitudes HTTP y hacer web scrapping para analizar el contenido de una p\u00e1gina web. Introducci\u00f3n Requests es una biblioteca de Python que permite realizar solicitudes HTTP de manera sencilla y eficiente. Por otro lado, BeautifulSoup es una biblioteca [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":1016,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[73],"tags":[257,90,274],"class_list":["post-908","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desarrollo-de-software","tag-apis","tag-python","tag-web-scraping"],"acf":[],"_links":{"self":[{"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/posts\/908","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/comments?post=908"}],"version-history":[{"count":2,"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/posts\/908\/revisions"}],"predecessor-version":[{"id":4511,"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/posts\/908\/revisions\/4511"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/media\/1016"}],"wp:attachment":[{"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/media?parent=908"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/categories?post=908"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/tags?post=908"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}