如何在Python中从谷歌功能中提取文本



我所说的谷歌功能是指,例如,当你在谷歌上键入"我感到好奇"时,第一个结果是一个随机事实,然后你就会得到基本结果。我想做的是用Python提取随机事实的文本。我尝试使用库requestsbs4。我注意到requests库找不到随机事实特征。

有其他提取文本的方法吗?

文本可以通过Selenium WebDriver和Python的UI提取。但是,由于每次加载页面时都更改了类名,所以选择器不会稳定。例如,获取问题文本的xpath将类似于//*[@id="rso"]/div/div/div/div/div/div/div/div/div[1]/div

顺便说一句,这是可能的。看看下面的例子:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_experimental_option("prefs", {"profile.default_content_setting_values.notifications": 2})
browser = webdriver.Chrome(chrome_options=chrome_options)
browser.get("https://www.google.com")
search_box= browser.find_element_by_id("lst-ib")
search_box.send_keys("I'm feeling curious")
search_box.submit()
wait = WebDriverWait(browser, 5)
question = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="rso"]/div/div/div/div/div/div/div/div/div[1]/div')))
answer = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="rso"]/div/div/div/div/div/div/div/div/div[2]/div')))
from time import sleep
count = 3
while not answer.text:
if not count: break
sleep(1)
answer = browser.find_element_by_xpath('//*[@id="rso"]/div/div/div/div/div/div/div/div/div[2]/div')
url = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="rso"]/div/div/div/div/div/div/div/div/div/p/a'))).get_attribute('href')
print('Question: {} nAnswer: {}nUrl: {}'.format(question.text, answer.text, url))

如果安装了Selenium,则可以运行此代码,如果需要,还可以运行其他依赖项。

最新更新