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.