scraping parser online from example python html python-3.x beautifulsoup html-parsing

parser - Cómo extraer enlaces html con una palabra coincidente de un sitio web usando python



install beautifulsoup python 3 (1)

Debe buscar la palabra india en el texto que se muestra . Para hacer esto, necesitarás una función personalizada en su lugar:

from bs4 import BeautifulSoup import requests url = "http://www.bbc.com/news/world/asia/" r = requests.get(url) soup = BeautifulSoup(r.content) india_links = lambda tag: (getattr(tag, ''name'', None) == ''a'' and ''href'' in tag.attrs and ''india'' in tag.get_text().lower()) results = soup.find_all(india_links)

El india_links lambda encuentra todas las etiquetas que son <a> enlaces con un atributo href y contienen india (sin distinción entre mayúsculas y minúsculas) en algún lugar del texto que se muestra.

Tenga en cuenta que utilicé el atributo de requests respuestas del atributo .content ; deja la decodificación a BeautifulSoup!

Manifestación:

>>> from bs4 import BeautifulSoup >>> import requests >>> url = "http://www.bbc.com/news/world/asia/" >>> r = requests.get(url) >>> soup = BeautifulSoup(r.content) >>> india_links = lambda tag: getattr(tag, ''name'', None) == ''a'' and ''href'' in tag.attrs and ''india'' in tag.get_text().lower() >>> results = soup.find_all(india_links) >>> from pprint import pprint >>> pprint(results) [<a href="/news/world/asia/india/">India</a>, <a class="story" href="/news/world-asia-india-30647504" rel="published-1420102077277">India scheme to monitor toilet use </a>, <a class="story" href="/news/world-asia-india-30640444" rel="published-1420022868334">India to scrap tax breaks on cars</a>, <a class="story" href="/news/world-asia-india-30640436" rel="published-1420012598505">India shock over Dhoni retirement</a>, <a href="/news/world/asia/india/">India</a>, <a class="headline-anchor" href="/news/world-asia-india-30630274" rel="published-1419931669523"><img alt="A Delhi police officer with red flag walks amidst morning fog in Delhi, India, Monday, Dec 29, 2014. " src="http://news.bbcimg.co.uk/media/images/79979000/jpg/_79979280_79979240.jpg"/><span class="headline heading-13">India fog continues to cause chaos</span></a>, <a class="headline-anchor" href="/news/world-asia-india-30632852" rel="published-1419940599384"><span class="headline heading-13">Court boost to India BJP chief</span></a>, <a class="headline-anchor" href="/sport/0/cricket/30632182" rel="published-1419930930045"><span class="headline heading-13">India captain Dhoni quits Tests</span></a>, <a class="story" href="http://www.bbc.co.uk/news/world-radio-and-tv-15386555" rel="published-1392018507550"><img alt="A woman riding a scooter waits for a traffic signal along a street in Mumbai February 5, 2014." src="http://news.bbcimg.co.uk/media/images/72866000/jpg/_72866856_020889093.jpg"/>Special report: India Direct</a>, <a href="/2/hi/south_asia/country_profiles/1154019.stm">India</a>]

Tenga en cuenta el enlace http://www.bbc.co.uk/news/world-radio-and-tv-15386555 aquí; tuvimos que usar la búsqueda lambda porque una búsqueda con una expresión regular de text no habría encontrado ese elemento; el texto contenido ( Informe especial: India Direct ) no es el único elemento en la etiqueta y, por lo tanto, no se encontró.

Un problema similar se aplica al enlace /news/world-asia-india-30632852 ; el elemento <span> anidado hace que el impulso del Tribunal al texto principal del jefe de India BJP no sea un elemento secundario directo de la etiqueta de enlace.

Puede extraer solo los enlaces con:

from urllib.parse import urljoin result_links = [urljoin(url, tag[''href'']) for tag in results]

donde todas las URL relativas se resuelven en relación con la URL original:

>>> from urllib.parse import urljoin >>> result_links = [urljoin(url, tag[''href'']) for tag in results] >>> pprint(result_links) [''http://www.bbc.com/news/world/asia/india/'', ''http://www.bbc.com/news/world-asia-india-30647504'', ''http://www.bbc.com/news/world-asia-india-30640444'', ''http://www.bbc.com/news/world-asia-india-30640436'', ''http://www.bbc.com/news/world/asia/india/'', ''http://www.bbc.com/news/world-asia-india-30630274'', ''http://www.bbc.com/news/world-asia-india-30632852'', ''http://www.bbc.com/sport/0/cricket/30632182'', ''http://www.bbc.co.uk/news/world-radio-and-tv-15386555'', ''http://www.bbc.com/2/hi/south_asia/country_profiles/1154019.stm'']

Tengo una url, decir http://www.bbc.com/news/world/asia/ . Justo en esta página quería extraer todos los enlaces que tiene India o INDIA o india (debe ser insensible a mayúsculas y minúsculas).

Si hago clic en cualquiera de los enlaces de salida, debería llevarme a la página correspondiente, por ejemplo, son pocas las líneas que tienen India, la conmoción por el retiro de Dhoni y la niebla de la India sigue causando caos . Si hago clic en estos enlaces, se me redireccionará a http://www.bbc.com/news/world-asia-india-30640436 y http://www.bbc.com/news/world-asia-india-30630274 respectivamente. .

import urllib from bs4 import BeautifulSoup import re import requests url = "http://www.bbc.com/news/world/asia/" r = requests.get(url) data = r.text soup = BeautifulSoup(data) only_links = SoupStrainer(''a'', href=re.compile(''india'')) print (only_links)

Escribí un código mínimo muy básico en Python 3.4.2.