从 google 搜索页面抓取片段文本
Scrape the snippet text from google search page
当我们在 google 中搜索问题时,它通常会在如下片段中生成答案:
我的 objective 是在我的 python 代码中抓取此文本(“1961 年 8 月 4 日 ” 在屏幕截图中用红色标记圈出)。
在尝试抓取文本之前,我使用以下代码将网络响应存储在文本文件中:
page = requests.get("https://www.google.com/search?q=when+barak+obama+born")
soup = BeautifulSoup(page.content, 'html.parser')
out_file = open("web_response.txt", "w", encoding='utf-8')
out_file.write(soup.prettify())
在 inspect element 部分,我注意到代码片段在 div class Z0LcW XcVN5d
内(在截屏)。但是,我的 txt 文件中的响应不包含此类文本,更不用说 class name.
我也试过 作者抓取了 ID 为 rhs_block
的项目。但是我的回复中没有这样的id。
我在我的响应 txt 文件中搜索了“1961 年 8 月 4 日”的出现,并试图理解它是否可能是该片段。但是 none 的事件似乎是我要找的那个。
我的计划是获取片段的 div id 或 class 名称并找到其内容,如下所示:
# IT'S A PSEUDO CODE
containers = soup.find_all(class or id = 'somehting')
for tag in containers:
print(f"tag text : {tag.text}")
有什么办法吗?
注意: 我也可以使用 beautifulsoup 以外的库和请求,只要它能产生结果。
Selenium 会产生您需要的结果。
这很方便,因为您可以添加任何等待时间并查看屏幕上实际发生的情况。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome(executable_path='/snap/bin/chromium.chromedriver')
driver.get('https://google.com/')
assert "Google" in driver.title
wait = WebDriverWait(driver, 20)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".gLFyf.gsfi")))
input_field = driver.find_element_by_css_selector(".gLFyf.gsfi")
input_field.send_keys("how many people in the world")
input_field.send_keys(Keys.RETURN)
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".Z0LcW.XcVN5d")))
result = driver.find_element_by_css_selector(".Z0LcW.XcVN5d").text
print(result)
driver.close()
driver.quit()
结果可能会让你大吃一惊:)
您需要安装 Selenium
和 Chromedriver
。您需要将 Chromedriver 可执行文件放在 Windows 的路径中,或显示 Linux 的路径。我的例子是 Linux.
无需使用 Selenium
,您可以使用 requests
和 BS4
实现此目的,因为您需要的一切都位于 HTML 并且没有动态 JavaScript.
online IDE中的代码和示例:
from bs4 import BeautifulSoup
import requests, lxml
headers = {
'User-agent':
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}
html = requests.get('https://www.google.com/search?q=Barack Obama born date', headers=headers).text
soup = BeautifulSoup(html, 'lxml')
born = soup.select_one('.XcVN5d').text
age = soup.select_one('.kZ91ed').text
print(born)
print(age)
输出:
August 4, 1961
age 59 years
当我们在 google 中搜索问题时,它通常会在如下片段中生成答案:
我的 objective 是在我的 python 代码中抓取此文本(“1961 年 8 月 4 日 ” 在屏幕截图中用红色标记圈出)。
在尝试抓取文本之前,我使用以下代码将网络响应存储在文本文件中:
page = requests.get("https://www.google.com/search?q=when+barak+obama+born")
soup = BeautifulSoup(page.content, 'html.parser')
out_file = open("web_response.txt", "w", encoding='utf-8')
out_file.write(soup.prettify())
在 inspect element 部分,我注意到代码片段在 div class Z0LcW XcVN5d
内(在截屏)。但是,我的 txt 文件中的响应不包含此类文本,更不用说 class name.
我也试过 rhs_block
的项目。但是我的回复中没有这样的id。
我在我的响应 txt 文件中搜索了“1961 年 8 月 4 日”的出现,并试图理解它是否可能是该片段。但是 none 的事件似乎是我要找的那个。
我的计划是获取片段的 div id 或 class 名称并找到其内容,如下所示:
# IT'S A PSEUDO CODE
containers = soup.find_all(class or id = 'somehting')
for tag in containers:
print(f"tag text : {tag.text}")
有什么办法吗?
注意: 我也可以使用 beautifulsoup 以外的库和请求,只要它能产生结果。
Selenium 会产生您需要的结果。 这很方便,因为您可以添加任何等待时间并查看屏幕上实际发生的情况。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome(executable_path='/snap/bin/chromium.chromedriver')
driver.get('https://google.com/')
assert "Google" in driver.title
wait = WebDriverWait(driver, 20)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".gLFyf.gsfi")))
input_field = driver.find_element_by_css_selector(".gLFyf.gsfi")
input_field.send_keys("how many people in the world")
input_field.send_keys(Keys.RETURN)
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".Z0LcW.XcVN5d")))
result = driver.find_element_by_css_selector(".Z0LcW.XcVN5d").text
print(result)
driver.close()
driver.quit()
结果可能会让你大吃一惊:)
您需要安装 Selenium
和 Chromedriver
。您需要将 Chromedriver 可执行文件放在 Windows 的路径中,或显示 Linux 的路径。我的例子是 Linux.
无需使用 Selenium
,您可以使用 requests
和 BS4
实现此目的,因为您需要的一切都位于 HTML 并且没有动态 JavaScript.
online IDE中的代码和示例:
from bs4 import BeautifulSoup
import requests, lxml
headers = {
'User-agent':
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}
html = requests.get('https://www.google.com/search?q=Barack Obama born date', headers=headers).text
soup = BeautifulSoup(html, 'lxml')
born = soup.select_one('.XcVN5d').text
age = soup.select_one('.kZ91ed').text
print(born)
print(age)
输出:
August 4, 1961
age 59 years