首页 > 解决方案 > Python 3 - 删除网络抓取的不必要结果

问题描述

对于某种类型的业务,我有一个关于此特定页面的网络抓取问题,结果有不止一种类型的业务到达。如果业务仅属于一个类别(例如药房),则这些说明可以正常工作:

# import libraries
from urllib.request import urlopen
from bs4 import BeautifulSoup

quote_page = ['http://www.paginasamarillas.com.ar/buscar/q/farmacia/p-1/']
print (quote_page)

data = []
	
for pg in quote_page:
	page = urlopen(pg)
	soup = BeautifulSoup(page, 'html.parser')

	# Search company name and business type
	nombreBox = soup.find('div', attrs={'class':'t1 business-name', 'itemprop':'name'})
	tipoBox = soup.find('div', attrs={'class':'business-categories'})
	
	# Clean Results
	nombre = nombreBox.text.strip()
	tipo = tipoBox.text.strip()
	# tipo = tipo.split(" ")[0] # Tried with split and print only first word but is not working

	
	# Record results on array
	data.append((nombre, tipo))
	print (nombre, tipo)

#####################  RESULTS #######################

['http://www.paginasamarillas.com.ar/buscar/q/farmacia/p-1/']
Farmacia Iphais Farmacias
________^______ ____^____
 Company Name    BZ type
######################################################  

但有些业务不仅属于一个类别,而且带有一个“更多+”链接,其中包含更多详细信息,结果如下:

#####################  RESULTS #######################

['http://www.paginasamarillas.com.ar/buscar/q/farmacia/p-1/'] 
Farmacia Zimerman Farmacias  #Starting here there are more business kind I don´t want it

 Perfumerias                                                                                                                                                                                                                                                                             mas +                                                                                                                   menos -     

    ###################################################### 

我只想保留第一种业务或类别而不是多个,并丢弃“更多+”链接下的所有结果。

提前感谢您的帮助和建议!!

标签: pythonstringweb-scraping

解决方案


在业务类别元素中,有一个存储第一个特征的“a”标签。您可以在tipoBox 中搜索此元素,然后将其打印出来。

tipoBox = soup.find('div', attrs={'class':'business-categories'})
first_element = tipoBox.find('a')

我注意到目前您的程序只会打印网站上的第一个列表。假设您要循环浏览网站上的所有列表,这是我如何重写您的程序以获得机构名称和第一个描述:

  for pg in quote_page:
    page = urlopen(pg)
    soup = BeautifulSoup(page, 'html.parser')

    business = soup.find('ul', class_='businesses')
    links = business.find_all('li', class_='business')

    data = []
    for link in links:
        nombreBox = link.find('div', attrs={'class':'t1 business-name', 'itemprop':'name'})
        category = link.find('div', attrs={'class':'business-categories'})
        first_element = category.find('a')
        data.append((nombreBox.text.strip(), first_element.text.strip()))

    return data

推荐阅读