Как я могу получить данные из промежутка в BeautifulSoup?

#python #web-scraping #beautifulsoup

Вопрос:

Это мой код, я хочу взять название местоположения и ссылку, переменная «lugares» находит несколько контейнеров элементов, но мне нужен только первый [0]; затем идет цикл for, но я не могу найти классы span.

 from bs4 import BeautifulSoup
import requests

b=[]
i="https://www.vivanuncios.com.mx"
url = "https://www.vivanuncios.com.mx/s-renta-inmuebles/estado-de-mexico/v1c1098l1014p1"

encabezado = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36",'Accept-Language': 'en-US, en;q=0.5'}

page =requests.get(url,headers=encabezado)

soup = BeautifulSoup(page.content,"html.parser")

lugares = soup.find_all("div",{"class":"items-container"})

lugares=lugares[0]
print(len(lugares))

for lugar in lugares:
    
    locationlink = i   str(lugar.find("span",{"class":"item"}).find("a")["href"])

    location= lugar.find("span",{"class":"item"}).text
    a=[location,locationlink]
    
    b.append(a)
 

Комментарии:

1. Вам нужны записи в верхней строке, например, Чиколоапан?

Ответ №1:

Существует несколько вариантов достижения цели, лучший из которых зависит от того, что вы ожидаете и хотите сделать с этой информацией в последующем процессе.

Первый Вариант

Если вы просто ищете информацию о первом местоположении, вы можете сделать следующее:

 lugar = soup.select_one('div.items-container a')   
b = [lugar.text, f'{i}{lugar["href"]}']
 

или

 lugar = soup.select('div.items-container a')[0]
b = [lugar.text, f'{i}{lugar["href"]}']
 

Оба выбирают первый <a> в <div> классе with items-container .

Выход

 ['Huixquilucan','https://www.vivanuncios.com.mx/s-renta-inmuebles/huixquilucan/v1c1098l10689p1']
 

Alternativ

Если вам интересно получить все сразу, вам следует использовать список dicts , поэтому позже вам просто нужно повторить его и получить всю информацию на месте:

 [{'name':x.text, 'link':f'{i}{x["href"]}'} for x in soup.select('div.items-container a')]
 

Выход

 [{'name': 'Huixquilucan',
  'link': 'https://www.vivanuncios.com.mx/s-renta-inmuebles/huixquilucan/v1c1098l10689p1'},
 {'name': 'Naucalpan',
  'link': 'https://www.vivanuncios.com.mx/s-renta-inmuebles/naucalpan/v1c1098l10710p1'},
 {'name': 'Atizapán',
  'link': 'https://www.vivanuncios.com.mx/s-renta-inmuebles/atizapan/v1c1098l10662p1'},
 {'name': 'Metepec',
  'link': 'https://www.vivanuncios.com.mx/s-renta-inmuebles/metepec-edomex/v1c1098l10707p1'},...]
 

Пример (показаны результаты обоих)

 from bs4 import BeautifulSoup
import requests

i="https://www.vivanuncios.com.mx"
url = "https://www.vivanuncios.com.mx/s-renta-inmuebles/estado-de-mexico/v1c1098l1014p1"

encabezado = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36",'Accept-Language': 'en-US, en;q=0.5'}

page =requests.get(url,headers=encabezado)
soup = BeautifulSoup(page.content,"html.parser")

lugar = soup.select_one('div.items-container a')
b = [lugar.text, f'{i}{lugar["href"]}']
print(f'First lugar:n {b} n')

## or alternative option

allLugaros = [{'name':x.text, 'link':f'{i}{x["href"]}'} for x in soup.select('div.items-container a')]

print(f'First lugar from lugaros (list of dict):n {allLugaros[0]} n')
print(f'All lugaros as list of dict:n {allLugaros} n')
 

Ответ №2:

Во-первых, вам нужно получить все spans в первых Лугарах lugares[0] .

Затем вам нужно выполнить итерацию для каждого промежутка, чтобы получить ссылку и текст для каждого местоположения.

Код:

 from bs4 import BeautifulSoup
import requests

b=[]
i="https://www.vivanuncios.com.mx"
url = "https://www.vivanuncios.com.mx/s-renta-inmuebles/estado-de-mexico/v1c1098l1014p1"

encabezado = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36",'Accept-Language': 'en-US, en;q=0.5'}

page =requests.get(url,headers=encabezado)

soup = BeautifulSoup(page.content,"html.parser")

lugares = soup.find_all("div",{"class":"items-container"})

#lugares=lugares[0]
print(len(lugares))

# get all spans
spans = lugares[0].find_all("span",{"class":"item"})

# itreate throw each span
for span in spans: 
    # get location text
    location = span.find("a").text

    # locationlink builder
    site = "www.vivanuncios.com.mx"
    link = span.find("a")["href"]
    locationlink = f"{site}{link}"   

    a = [location,locationlink]
    b.append(a)

print (b[0])
 

Выход:

 ['Huixquilucan', 'www.vivanuncios.com.mx/s-renta-inmuebles/huixquilucan/v1c1098l10689p1']