Очистка поисковой выдачи с помощью Beautiful Soup - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь создать простой скрипт для очистки первой страницы результатов поиска Google и экспорта результатов в .csv. Мне удалось получить URL-адреса и заголовки, но я не могу получить описания. Я использовал следующий код:

import urllib
import requests
from bs4 import BeautifulSoup

# desktop user-agent
USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0"
# mobile user-agent
MOBILE_USER_AGENT = "Mozilla/5.0 (Linux; Android 7.0; SM-G930V Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.36"

query = "pizza recipe"
query = query.replace(' ', '+')
URL = f"https://google.com/search?q={query}"

headers = {"user-agent": USER_AGENT}
resp = requests.get(URL, headers=headers)

if resp.status_code == 200:
    soup = BeautifulSoup(resp.content, "html.parser")
    results = []
    for g in soup.find_all('div', class_='r'):
        anchors = g.find_all('a')
        if anchors:
            link = anchors[0]['href']
            title = g.find('h3').text
            desc = g.select('span')
            description = g.find('span',{'class':'st'}).text
            item = {
                "title": title,
                "link": link,
                "description": description
            }
            results.append(item)

import pandas as pd
df = pd.DataFrame(results)
df.to_excel("Export.xlsx")

При запуске кода я получаю следующее сообщение:

description = g.find('span',{'class':'st'}).text
AttributeError: 'NoneType' object has no attribute 'text'

По сути, поле пустое.

Может ли кто-нибудь помочь мне с этой строкой, чтобы я мог получить всю информацию из сниппета?

1 Ответ

0 голосов
/ 27 мая 2020

Это не в div class = "r". Он находится в div class = "s"

Так что измените это для описания:

description = g.find_next_sibling("div", class_='s').find('span',{'class':'st'}).text

Из текущего элемента он найдет следующий div с class = "s". Потом можно вытащить тег <span>

...