Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在谷歌搜索一个关键字列表中出现的一个又一个并提取数据_Python_Python 3.x_Selenium_Selenium Webdriver_Selenium Chromedriver - Fatal编程技术网

Python 如何在谷歌搜索一个关键字列表中出现的一个又一个并提取数据

Python 如何在谷歌搜索一个关键字列表中出现的一个又一个并提取数据,python,python-3.x,selenium,selenium-webdriver,selenium-chromedriver,Python,Python 3.x,Selenium,Selenium Webdriver,Selenium Chromedriver,假设我有一个由城市组成的列表。比如说, zip=['纽约','德里] 如何在google上搜索纽约pincode和德里pincode并提取数据 这个 给出了结果,并且存在多个共点。我只需要开第一个 我需要的输出: {纽约:10001,德里:110001} 我试过这个 from selenium import webdriver from selenium.webdriver.common.keys import Keys from bs4 import BeautifulSoup import

假设我有一个由城市组成的列表。比如说,

zip=['纽约','德里]

如何在google上搜索纽约pincode和德里pincode并提取数据

这个 给出了结果,并且存在多个共点。我只需要开第一个

我需要的输出:

{纽约:10001,德里:110001}

我试过这个

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import re
import pandas as pd
import os
import html5lib
import json
import time
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
from selenium.webdriver.common.keys import Keys
url = "https://www.google.com/"
chromedriver = r"C:\Users\me\chromedriver"
driver = webdriver.Chrome(chromedriver)
driver.implicitly_wait(30)
driver.get(url)
search = driver.find_element_by_name('q')
pincodencodee=['newyork','delhi']
for i in pincodencodee:    
    search.send_keys(i)
search.send_keys(Keys.RETURN) 
time.sleep(5) 
driver.quit()

好的,这是一个需要常量dom结构或重正则表达式的问题

我不会在正则表达式上浪费时间,但是我可以帮助您提取代码本身

因此,我将尝试在浏览器上执行javascript,以便:

webdriver.execute_script('script')
这本身是不好的,所以让我们更进一步。让我们初始化一个变量并调用它
area\u code
,这样我们就可以将它推送到列表中,然后将它作为参数传递到
execute\u script()
函数中。我们还可以使用javascript获取代码

area_code = "0"
webdriver.execute_script("arguments[0] = document.getElementsByClassName('title')[0].innerText", area_code )
这里的第二行
参数[0]
实际上是我们正在设置的
区域\u code
变量


然后您可以执行键值或2D数组来存储数据。

第一个邮政编码具有属性
数据idx
,该属性从0运行索引,因此第一个邮政编码将具有
数据idx=“0”
。您还需要每次重新定位搜索栏,以防止出现
StaleElementReferenceException

driver.maximize_window()
driver.get(url)

pincodencodee = {'new york': -1, 'delhi': -1}
for key in pincodencodee.keys():
    search = driver.find_element_by_name('q')
    search.clear()
    search.send_keys(key + ' pincode')
    search.send_keys(Keys.RETURN)

    code = driver.find_element_by_css_selector('.rl_item[data-idx="0"] .title')
    pincodencodee[key] = code.text

driver.quit()

print(pincodencodee) # {'new york': '10001', 'delhi': '110001'}

正如您所期望的输出:

{Newyork: 10001, Delhi: 110001}
假设它是一个,您需要使用提供的列表中的
键和结果中的
值来构造它。要实现这一点,您可以使用以下方法:

  • 代码块:

    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
    from selenium.common.exceptions import TimeoutException
    from selenium.webdriver.common.keys import Keys
    
    cities = ['newyork','delhi']
    search_texts = [city + ' pincode' for city in cities]
    print(search_texts)
    pincode = []
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument("start-maximized")
    chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
    chrome_options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=chrome_options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("https://www.google.com/")
    for my_text in search_texts:
        try:
            search = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.NAME, "q")))
            search.clear()
            search.send_keys(my_text)
            search.send_keys(Keys.RETURN)
            element_text = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@class='rl_item rl_item_base']//div[@class='title']"))).text
            pincode.append(element_text)
        except TimeoutException as e:
            print(e)
    Dict = dict(zip(cities, pincode))
    print(Dict)
    driver.quit()
    
  • 控制台输出:

    ['newyork pincode', 'delhi pincode']
    {'newyork': '10001', 'delhi': '110001'}
    

更新您的问题添加表1和表2的表架构@艾瑪艾瑪艾瑪 这将返回第一个值。如果您搜索“纽约区号”,它将加载以下页面:从那里,我只需抓取第一个元素并获取其内部文本,将其放入参数中,然后您可以对其执行任何操作,是的,只需根据您的喜好格式化代码并处理变量名等。在这行代码中
pincodencodee=['newyork','drish']pincodencodee中的i:search.send_keys(i)
它占据了两个位置,而不是一个位置。