Webscraping: упростить код, используя для l oop внутри словаря - PullRequest
0 голосов
/ 04 марта 2020

Я создал код для веб-страниц некоторых бразильских новостных страниц, но теперь я понял, что, возможно, это излишне долго. Я пытаюсь упростить вещи с помощью для l oop, но я не могу найти те же результаты. Нет необходимости показывать мне новый код, так как я все еще учусь. Но если бы кто-то мог просто дать мне подсказку, я бы оценил это.

Оригинальный код:

#web scraping: Yahoo Finanças 
url_yf = "https://br.financas.yahoo.com/"
page_yf = requests.get(url_yf)
page_content_yf = page_yf.content
soup_yf = bs(page_content_yf, "lxml")
news_yf = soup_yf.find_all("h3", {"class" : "Mb(5px)"})
titles_yf = [i.text for i in news_yf]

#web scraping: Estadão 
url_est = "https://www.estadao.com.br/ultimas"
page_est = requests.get(url_est)
page_content_est = page_est.content
soup_est = bs(page_content_est, "lxml")
news_est = soup_est.find_all("section", {"class" : "col-md-6 col-sm-6 col-xs-12 col-margin"})
titles_est = [i.text for i in news_est]

#web scraping: Folha de São Paulo
url_fsp = "https://www1.folha.uol.com.br/ultimas-noticias/"
page_fsp = requests.get(url_fsp)
page_content_fsp = page_fsp.content
soup_fsp = bs(page_content_fsp, "html.parser")
news_fsp = soup_fsp.find_all("div", {"class" : "c-headline__content"})
titles_fsp = str([i.text for i in news_fsp]).strip('[]')
titles_fsp_clean = re.sub(r'\\n', ' ', titles_fsp)

#web scraping: Valor Econômico
url_ve = "https://valor.globo.com/ultimas-noticias/"
page_ve = requests.get(url_ve)
page_content_ve = page_ve.content
soup_ve = bs(page_content_ve, "lxml")
news_ve = soup_ve.find_all("div", {"class" : "feed-post-body-title gui-color-primary gui-color-hover"})
titles_ve = [i.text for i in news_ve]

#web scraping: InfoMoney
url_im = "https://www.infomoney.com.br/ultimas-noticias/"
page_im = requests.get(url_im)
page_content_im = page_im.content
soup_im = bs(page_content_im, "lxml")
news_im = soup_im.find_all("span", {"class" : "hl-title hl-title-2"})
titles_im = [i.text for i in news_im]

#cleaning titles
list_of_titles = [titles_yf, titles_est, titles_fsp_clean, titles_ve, titles_im]
titles = [title for title in list_of_titles for title in title]

Тот, над которым я сейчас работаю:

classes = ["h3", {"class" : "Mb(5px)"}, "section", {"class" : "col-md-6 col-sm-6 col-xs-12 col-margin"}, "div", {"class" : "c-headline__content"}, "div", {"class" : "feed-post-body-title gui-color-primary gui-color-hover"}, "span", {"class" : "hl-title hl-title-2"}]

url = {"https://br.financas.yahoo.com/": classes[0], "https://www.estadao.com.br/ultimas": classes[1], "https://www1.folha.uol.com.br/ultimas-noticias/": classes[2], "https://valor.globo.com/ultimas-noticias/": classes[3], "https://www.infomoney.com.br/ultimas-noticias/": classes[4]}

for (key, value) in url.items():
    page = requests.get(key)
    page_content = page.content
    soup = bs(page_content, "html.parser")
    news = soup.find_all(value)
    titles = [i.text for i in news]

cleaning = str(titles).strip('[]')
cleaning2 = re.sub(r'\\n', ' ', cleaning)

Идея, которую я имею, состоит в том, чтобы попытаться проникнуть внутрь oop словарь (я должен был составить список классов, потому что у меня возникли проблемы с кавычками внутри словаря), чтобы использовать точное значение относительно URL. Я еще совсем нуб в python, но мне это кажется возможным. К сожалению, я не могу найти такие же результаты.

1 Ответ

0 голосов
/ 04 марта 2020

Вы можете использовать подсписки ["h3", {"class" : "Mb(5px)"}] в списке classes или непосредственно в url

url = {
   "https://br.financas.yahoo.com/": ["h3", {"class" : "Mb(5px)"}], 
   "https://www.estadao.com.br/ultimas": ["section", {"class" : "col-md-6 col-sm-6 col-xs-12 col-margin"}], 
   "https://www1.folha.uol.com.br/ultimas-noticias/": ["div", {"class" : "c-headline__content"}], 
   "https://valor.globo.com/ultimas-noticias/": ["div", {"class" : "feed-post-body-title gui-color-primary gui-color-hover"}], 
   "https://www.infomoney.com.br/ultimas-noticias/": ["span", {"class" : "hl-title hl-title-2"}],
}

, а затем вы можете использовать value[0], value[1]

 news = soup.find_all(value[0], value[1])

или даже используя *, чтобы распаковать value в качестве аргументов для find_all()

 news = soup.find_all(*value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...