繁体   English   中英

Selenium / Beautiful Soup 无法在网页中找到元素

[英]Selenium / Beautiful Soup can't find elements inside a Webpage

我正在制作一个程序来抓取一些网站,我在抓取其中一个网站时发现了一个问题。 在其他方面,我找到了使用 Selenium + BS4 获取所需信息并浏览页面的方法。

页面是这个: https : //www.borm.es/#/home/sumario/21-11-2020

现在,目标是从类中获取所有段落:ng-binding,以及每个段落下面的每个“VER ANUNCIO”的链接。

通常我会使用soup.find_all() 来获取所有元素并导航树或使用Selenium 使用XPATH/CSS SELECTOR 获取所有元素。

我面临的问题是 find_all() 或 find() 不返回任何内容(空列表或 None),而 Selenium 也返回 None 。

我试过检查元素是否在框架内,我认为它们不是。 我已经尝试过 WebDriver 等待,看看页面是否应该在做某事之前停止加载。 不同的类/标签给出相同的结果。

现在,当我打印 BeautifulSoup 对象时,它返回这个而不是我在检查页面时看到的 HTML 代码:

<!DOCTYPE html>

<html data-ng-app="BormApp" lang="es">
<head>
<title>Sede Electrónica del Boletín Oficial de la Región de Murcia</title>
<meta content="zjUBcjStVhysvi2ANOAn6-FG7aKKif43J62Ifad9JjA" name="google-site-verification"/>
<!-- META ROBOTS -->
<meta content="index,follow,all" name="robots"/>
<!-- METAS GENÉRICAS -->
<meta charset="utf-8"/>
<base href="/"/>
<meta content="IE=edge" http-equiv="X-UA-Compatible"/>
<meta content="Sede Electrónica del Boletín Oficial de la Región de Murcia" name="title"/>
<meta content="Sede Electrónica del Boletín Oficial de la Región de Murcia" name="description"/>
<meta content="borm" name="author"/>
<!-- CARGA DE FUENTES -->
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,700" rel="stylesheet"/>
<link href="https://fonts.googleapis.com/css?family=Coiny" rel="stylesheet"/>
<!-- CSS -->
<link href="resources/css/main.css" media="screen" rel="stylesheet"/>
<link href="resources/css/bootstrap.min.css" media="screen" rel="stylesheet"/>
<link href="resources/css/estilos.css" media="screen" rel="stylesheet"/>
<link href="resources/css/imprimir.css" media="print" rel="stylesheet"/>
<link crossorigin="anonymous" href="https://use.fontawesome.com/releases/v5.0.13/css/all.css" integrity="sha384-DNOHZ68U8hZfKXOrtjWvjxusGo9WQnrNx2sqG0tfsghAvtVlRW3tvkXWZh58N9jp" rel="stylesheet"/>
<link href="resources/css/bootstrap-datetimepicker.css" rel="stylesheet"> <!-- datepiker -->
<link href="resources/css/bootstrap-select.min.css" rel="stylesheet"/> <!-- select -->
<!-- Propio -->
<link href="resources/css/site.css" rel="stylesheet"/>
<link href="resources/css/jquery-ui.css" rel="stylesheet"/>
<!-- Estilos  -->
<link href="bower_components/metisMenu/dist/metisMenu.min.css" rel="stylesheet"/>
<link href="bower_components/angular-loading-bar/build/loading-bar.min.css" rel="stylesheet"/>
<link href="resources/css/bootstrap-year-calendar.min.css" rel="stylesheet"/>
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"/>
<!-- FAVICON -->
<link href="resources/images/favicon.png" rel="icon" type="image/png">
<!--[if IE]><link rel="shortcut icon" type="image/x-icon" href="resources/images/favicon.png" /><![endif]-->
<link href="./favicon.ico" rel="shortcut icon" type="image/x-icon">
<link href="resources/images/favicon.png" rel="apple-touch-icon">
<!-- PLUGINS GENERALES -->
<script src="resources/js/jquery.js"></script>
<script src="resources/js/jquery-ui.js"></script>
<script src="resources/js/moment.min.js"></script> <!-- datepiker -->
<script src="resources/js/es.js"></script> <!-- datepiker -->
<script src="resources/js/bootstrap.min.js"></script>
<script src="resources/js/bootstrap-hover-dropdown.min.js"></script>
<script src="resources/js/bootstrap-datetimepicker.min.js"></script> <!-- datepiker -->
<script src="resources/js/bootstrap-select.min.js"></script> <!-- select -->
<script src="resources/js/defaults-es_ES.js"></script>
<!-- Javascript -->
<script src="bower_components/angular/angular.js"></script>
<script src="bower_components/angular-ui-router/release/angular-ui-router.min.js"></script>
<script src="bower_components/json3/lib/json3.min.js"></script>
<script src="bower_components/oclazyload/dist/ocLazyLoad.min.js"></script>
<script src="bower_components/angular-loading-bar/build/loading-bar.min.js"></script>
<script src="bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js"></script>
<script src="bower_components/metisMenu/dist/metisMenu.min.js"></script>
<script src="bower_components/moment/min/moment-with-locales.min.js"></script>
<script src="bower_components/angular-sanitize/angular-sanitize.min.js"></script>
<script src="bower_components/angular-translate/angular-translate.min.js"></script>
<script src="bower_components/angular-dynamic-locale/dist/tmhDynamicLocale.js"></script>
<script src="https://code.angularjs.org/1.6.6/i18n/angular-locale_es-es.js"></script>
<script src="resources/js/bootstrap-year-calendar.min.js"></script>
<script src="scripts/i18n/messages_es.js"></script>
<script src="scripts/i18n/messages_en.js"></script>
<!-- Application Modules -->
<script src="scripts/app.js"></script>
<script src="scripts/boletines/controllers/boletinController.js"></script>
<script src="scripts/suplementos/controllers/suplementoController.js"></script>
<script src="scripts/buzonSugerencias/controllers/sugerenciaController.js"></script>
<script src="scripts/homeBorm/controllers/homeController.js"></script>
<script src="scripts/sumario/controllers/sumarioController.js"></script>
<script src="scripts/anunciantes/controllers/anunciantesController.js"></script>
<script src="scripts/anunciante/controllers/anuncianteController.js"></script>
<script src="scripts/anuncio/controllers/anuncioController.js"></script>
<script src="scripts/calendario/controllers/calendarioController.js"></script>
<script src="scripts/sumarioSuplementos/controllers/sumarioSuplementoController.js"></script>
<script src="scripts/ayuntamientos/controllers/ayuntamientosController.js"></script>
<script src="scripts/ayuntamiento/controllers/ayuntamientoController.js"></script>
<script src="scripts/noticias/controllers/noticiasController.js"></script>
<script src="scripts/masVisitado/controllers/masVisitadoController.js"></script>
<script src="scripts/normativaGeneral/controllers/normativaGeneralController.js"></script>
<script src="scripts/plantillasEncuestas/controllers/plantillasEncuestasController.js"></script>
<script src="scripts/preguntasFrecuentes/controllers/preguntasFrecuentesController.js"></script>
<script src="scripts/calendarioSede/controllers/calendarioSedeController.js"></script>
<script src="scripts/directorio/controllers/directorioController.js"></script>
<script src="scripts/datosAbiertos/controllers/datosAbiertosController.js"></script>
<script src="scripts/suscripcion/controllers/suscripcionController.js"></script>
<script src="scripts/normativa/controllers/normativaController.js"></script>
<script src="scripts/enlaces/controllers/enlacesController.js"></script>
<script src="scripts/buscador/controllers/buscadorController.js"></script>
<script src="scripts/rss/controllers/rssController.js"></script>
<script src="scripts/suscripcion/controllers/loginController.js"></script>
<script src="scripts/eli/controllers/jurisdictionController.js"></script>
<script src="scripts/eli/controllers/typeController.js"></script>
<script src="scripts/eli/controllers/yearController.js"></script>
<script src="scripts/eli/controllers/monthController.js"></script>
<script src="scripts/eli/controllers/dayController.js"></script>
<script src="scripts/eli/controllers/numberController.js"></script>
<script src="scripts/eli/controllers/languageController.js"></script>
<script src="scripts/eli/controllers/normativaEliController.js"></script>
<script src="scripts/eli/controllers/corrigendumController.js"></script>
<script src="scripts/eli/controllers/normativaCorrigendumController.js"></script>
<!-- Application Services -->
<script src="scripts/buzonSugerencias/services/sugerenciaService.js"></script>
<script src="scripts/suscripcion/services/suscripcionService.js"></script>
<!-- Application Factories -->
<script src="scripts/suplementos/factories/suplementoFactory.js"></script>
<script src="scripts/boletines/factories/boletinFactory.js"></script>
<script src="scripts/buzonSugerencias/factories/sugerenciaFactory.js"></script>
<script src="scripts/sumario/factories/sumarioFactory.js"></script>
<script src="scripts/anuncio/factories/anuncioFactory.js"></script>
<script src="scripts/calendario/factories/calendarioFactory.js"></script>
<script src="scripts/sumarioSuplementos/factories/sumarioSuplementoFactory.js"></script>
<script src="scripts/ayuntamientos/factories/ayuntamientosFactory.js"></script>
<script src="scripts/noticias/factories/noticiasFactory.js"></script>
<script src="scripts/normativaGeneral/factories/normativaGeneralFactory.js"></script>
<script src="scripts/noticias/factories/noticiasFactory.js"></script>
<script src="scripts/plantillasEncuestas/factories/plantillasEncuestasFactory.js"></script>
<script src="scripts/preguntasFrecuentes/factories/preguntasFrecuentesFactory.js"></script>
<script src="scripts/calendarioSede/factories/calendarioSedeFactory.js"></script>
<script src="scripts/normativa/factories/normativaFactory.js"></script>
<script src="scripts/enlaces/factories/enlacesFactory.js"></script>
<script src="scripts/suscripcion/factories/suscripcionFactory.js"></script>
<script src="scripts/buscador/factories/buscadorFactory.js"></script>
<script src="scripts/rss/factories/rssFactory.js"></script>
<script src="scripts/eli/factories/eliFactory.js"></script>
<!-- Commons Services -->
<script src="scripts/commons/services/alertsService.js"></script>
<script src="scripts/commons/services/deviceService.js"></script>
<script src="scripts/commons/services/breadCrumbService.js"></script>
<!-- Interceptors -->
<script src="scripts/commons/factories/httpResponseErrorHandlerFactory.js"></script>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async="" src="https://www.googletagmanager.com/gtag/js?id=UA-23666061-1"></script>
<script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
    
      gtag('config', 'UA-23666061-1');
    </script>
<script>
        /**
        * Función que realiza un seguimiento de un clic en un enlace saliente en Analytics.
        * Esta función toma una cadena de URL válida como argumento y la utiliza
        * como la etiqueta del evento. Configurar el método de transporte como "beacon" permite que el hit se envíe
        * con "navigator.sendBeacon" en el navegador que lo admita.
        */
        var trackOutboundLink = function(url) {
          gtag('event', 'clic', {
            'event_category': 'saliente',
            'event_label': url,
            'transport_type': 'beacon',
            'event_callback': ''
          });
        }
    </script>
<!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
      <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->
</link></link></link></link></head>
<body>
<h1 class="hidden">UNO</h1>
<a class="hidden" href="https://www.borm.es/#/home/mapaWeb" title="map">Mapa web</a>
<a class="hidden" href="https://www.borm.es/accesibilidad.html" title="Accessibility">Accesibilidad</a>
<div>
<div data-ui-view=""></div>
</div>
</body>
</html>

在搜索时我发现了这个: Web-scraping JavaScript page with Python

但是我对此太陌生了,我只是不明白如何将它用于我的目的,但我认为它指向了正确的方向。

所以我的问题是,这个网页上发生了什么,你能指出我正确的方向吗? 也许我正在寻找的术语是什么,或者我如何使用 Selenium 或 BS4 来获得我正在寻找的东西。

提前致谢,祝您周末愉快!

编辑:如果有人需要这个,这是我正在运行的几段代码,它们在定位网页元素时返回空列表或 None 。


soup = BeautifulSoup(requests.get(browser.current_url).content, 'html.parser')


# finds all the disposiciones
lista_disposiciones = soup.find_all("div", {"class": "ng-binding"})
lista_disposiciones = soup.find_all("div", {"class": "ANYTHING THAT GOES HERE RETURNS NOTHING"})
lista_disposiciones = webdriver.find_elements(WHATEVER I USE TO LOCATE ELEMENTS RETURN NOTHING)

正在发生的事情是您正在查看的页面内容实际上是由 JavaScript 代码加载的你期待的元素。 有两种处理方法:

  1. 使用Selenium驱动 Web 浏览器(例如 Chrome)加载页面并等待使用 Selenium 调用加载您要查找的元素。 然后你可以从Selenium获取当前页面源并用它初始化BeautifulSoup并照常进行。 这是“标准”方法。
  2. 使用浏览器检查器,您可以查看页面加载后发出的网络 XHR 请求。 其中一个或多个将是获取额外数据以更新 DOM 的原因。 然后,您可以记下 GET 或 POST 请求是什么,自己发出请求并直接处理数据。

例如:

from selenium import webdriver
from bs4 import BeautifulSoup

options = webdriver.ChromeOptions()
options.add_argument("headless")
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(options=options)

try:
    driver.implicitly_wait(3) # wait up to 3 seconds before calls to find elements time out
    driver.get('https://www.borm.es/#/home/sumario/21-11-2020')
    elem = driver.find_element_by_class_name('ng-binding')
    soup = BeautifulSoup(driver.page_source, 'html.parser')
    lista_disposiciones = soup.find_all("h1", {"class": "ng-binding"})
    print(len(lista_disposiciones))
    print(lista_disposiciones)
finally:
    driver.quit()

印刷:

1
[<h1 class="ng-binding">Boletín Oficial de la Región de Murcia  Nº , 
                <a data-ng-href="/services/boletin/ano//numero//pdf" href="/services/boletin/ano//numero//pdf" target="_blank">
<img alt="Imagen de icono en PDF" src="resources/images/ico-pdf-01.png" title="Aquí puede descargar el boletín en PDF"/>
</a>
</h1>]

我发现的唯一具有ng-binding类的元素是在<h1>标签上。

或者可能发出以下 GET 请求(通过使用 Chromes 检查器分析页面加载期间发出的 XHR 请求来确定——见下图):

https://www.borm.es/services/boletin/fecha/21-11-2020/sumario

返回的是以下 JSON 字符串:

{"id":98838,"numero":271,"ano":2020,"fechaPublicacion":"21-11-2020","fechaPublicacionLarga":"sábado 21 de noviembre de 2020","boletinAnterior":98837,"fechaAnterior":"20-11-2020","boletinSiguiente":null,"fechaSiguiente":null,"extraordinario":false,"anunciosBoletin":[{"id":789282,"historico":false,"sumario":"Orden de 12 de noviembre de 2020, de la Consejería de Presidencia y Hacienda, por la que se aprueba el programa de materias y los ejercicios de las pruebas selectivas para ingreso en la Administración Pública Regional en el Cuerpo de Interventores y Auditores de la Región de Murcia, para el turno de acceso libre.","numero":6615,"ano":2020,"anunciante":"Consejería de Presidencia y Hacienda ","subAnunciante":"","apartado":"I. Comunidad Autónoma","subApartado":"2. Autoridades y Personal","categoriaCompleta":"Oposiciones - Temarios","fechaPublicacion":"21-11-2020","numeroBoletin":271,"paginas":15,"tamano":374.53,"numAccesos":63},{"id":789283,"historico":false,"sumario":"Convenio de colaboración a suscribir entre la Comunidad Autónoma de la Región de Murcia, a través del Instituto Murciano de Acción Social y el Ayuntamiento de Totana, para la prestación, dentro de su ámbito territorial, del servicio de ayuda a domicilio para personas dependientes.","numero":6616,"ano":2020,"anunciante":"Consejería de Mujer, Igualdad, LGTBI, Familias y Política Social","subAnunciante":"","apartado":"I. Comunidad Autónoma","subApartado":"3. Otras Disposiciones","categoriaCompleta":"Convenios","fechaPublicacion":"21-11-2020","numeroBoletin":271,"paginas":11,"tamano":358.49,"numAccesos":25},{"id":789284,"historico":false,"sumario":"Convenio de colaboración a suscribir entre la Comunidad Autónoma de la Región de Murcia, a través de la Consejería de Mujer, Igualdad, LGTBI, Familias Y Política Social, y la Asociación para la Mediación de la Región de Murcia, para la derivación y coordinación de casos del servicio de punto de encuentro familiar de violencia de género.","numero":6617,"ano":2020,"anunciante":"Consejería de Mujer, Igualdad, LGTBI, Familias y Política Social","subAnunciante":"","apartado":"I. Comunidad Autónoma","subApartado":"3. Otras Disposiciones","categoriaCompleta":"Convenios","fechaPublicacion":"21-11-2020","numeroBoletin":271,"paginas":7,"tamano":341.7,"numAccesos":25},{"id":789285,"historico":false,"sumario":"Convenio de colaboración a suscribir entre la Comunidad Autónoma de la Región de Murcia, a través del Instituto Murciano de Acción Social y el Ayuntamiento de Alcantarilla, para la prestación, dentro de su ámbito territorial, del servicio de ayuda a domicilio para personas dependientes.","numero":6618,"ano":2020,"anunciante":"Consejería de Mujer, Igualdad, LGTBI, Familias y Política Social","subAnunciante":"","apartado":"I. Comunidad Autónoma","subApartado":"3. Otras Disposiciones","categoriaCompleta":"Convenios","fechaPublicacion":"21-11-2020","numeroBoletin":271,"paginas":11,"tamano":371.31,"numAccesos":29},{"id":789286,"historico":false,"sumario":"Convenio de colaboración a suscribir entre la Comunidad Autónoma de la Región de Murcia, a través del Instituto Murciano de Acción Social y el Ayuntamiento de Puerto Lumbreras, para la prestación, dentro de su ámbito territorial, del servicio de ayuda a domicilio para personas dependientes.","numero":6619,"ano":2020,"anunciante":"Consejería de Mujer, Igualdad, LGTBI, Familias y Política Social","subAnunciante":"","apartado":"I. Comunidad Autónoma","subApartado":"3. Otras Disposiciones","categoriaCompleta":"Convenios","fechaPublicacion":"21-11-2020","numeroBoletin":271,"paginas":12,"tamano":365.48,"numAccesos":25},{"id":789287,"historico":false,"sumario":"Convenio entre la Comunidad Autónoma de la Región de Murcia, a través del Instituto Murciano de Acción Social y la Mancomunidad de Servicios Sociales del Río Mula, para regular los compromisos y condiciones aplicables a la concesión de una subvención nominativa destinada a mantenimiento de centro de atención temprana.","numero":6620,"ano":2020,"anunciante":"Consejería de Mujer, Igualdad, LGTBI, Familias y Política Social","subAnunciante":"","apartado":"I. Comunidad Autónoma","subApartado":"3. Otras Disposiciones","categoriaCompleta":"Convenios","fechaPublicacion":"21-11-2020","numeroBoletin":271,"paginas":20,"tamano":463.49,"numAccesos":23},{"id":789288,"historico":false,"sumario":"Modificación de la convocatoria de ayudas de la Orden de 11 de noviembre de 2020 de la Consejería de Turismo, Juventud y Deportes por la que se aprueban las bases reguladoras de las ayudas a guías de turismo y pymes, micropymes y autónomos con actividad de turismo activo, agencia de viajes, organización de congresos u hostelería para paliar pérdidas por el COVID-19, de la estrategia reactiva turismo y hostelería, modificada por orden de 19 de noviembre de 2020 y se abre nuevo plazo de presentación de solicitudes.","numero":6621,"ano":2020,"anunciante":"Consejería de Turismo, Juventud y Deportes","subAnunciante":"Instituto de Turismo de la Región de Murcia","apartado":"I. Comunidad Autónoma","subApartado":"3. Otras Disposiciones","categoriaCompleta":"Ayudas/subvenciones - Bases reguladoras/Convocatorias","fechaPublicacion":"21-11-2020","numeroBoletin":271,"paginas":3,"tamano":322.25,"numAccesos":123},{"id":789289,"historico":false,"sumario":"Resolución de la Dirección General de Regeneración y Modernización Administrativa por la que se fija el calendario de días inhábiles a efectos de cómputo de plazos en el ámbito de la Administración de la Comunidad Autónoma de la Región de Murcia para el año 2021.","numero":6622,"ano":2020,"anunciante":"Consejería de Transparencia, Participación y Administración Pública","subAnunciante":"","apartado":"I. Comunidad Autónoma","subApartado":"3. Otras Disposiciones","categoriaCompleta":null,"fechaPublicacion":"21-11-2020","numeroBoletin":271,"paginas":4,"tamano":528.37,"numAccesos":73},{"id":789290,"historico":false,"sumario":"Orden de 20 de noviembre de 2020 de la Consejería de Salud, por la que se prorroga parcialmente la vigencia de las medidas generales, de carácter temporal, para hacer frente a la epidemia de COVID-19 en la Región de Murcia contenidas en la Orden de 9 de octubre de 2020 y en la Orden 26 de octubre de 2020 y se adoptan medidas extraordinarias y temporales de restricción en determinados ámbitos sectoriales.","numero":6623,"ano":2020,"anunciante":"Consejería de Salud","subAnunciante":"","apartado":"I. Comunidad Autónoma","subApartado":"3. Otras Disposiciones","categoriaCompleta":null,"fechaPublicacion":"21-11-2020","numeroBoletin":271,"paginas":9,"tamano":353.37,"numAccesos":928},{"id":789291,"historico":false,"sumario":"Resolución de la Dirección General de Diálogo Social y Bienestar Laboral, por la que se dispone la inscripción en el registro y publicación del Acuerdo de convenio colectivo de la empresa ZUKAN,S.L.","numero":6624,"ano":2020,"anunciante":"Consejería de Empleo, Investigación y Universidades","subAnunciante":"","apartado":"I. Comunidad Autónoma","subApartado":"3. Otras Disposiciones","categoriaCompleta":"Convenios","fechaPublicacion":"21-11-2020","numeroBoletin":271,"paginas":39,"tamano":1035.97,"numAccesos":29},{"id":789292,"historico":false,"sumario":"Divorcio contencioso 367/2019.","numero":6625,"ano":2020,"anunciante":"Servicio Común Procesal de Ordenación del Procedimiento de Murcia","subAnunciante":"Primera Instancia número Tres de Murcia","apartado":"III. Administración de Justicia","subApartado":null,"categoriaCompleta":"Autos","fechaPublicacion":"21-11-2020","numeroBoletin":271,"paginas":1,"tamano":308.03,"numAccesos":33},{"id":789293,"historico":false,"sumario":"Procedimiento ordinario 314/2019.","numero":6626,"ano":2020,"anunciante":"Servicio Común Procesal de Ordenación del Procedimiento Social de Murcia","subAnunciante":"De lo Social número Tres de Murcia","apartado":"III. Administración de Justicia","subApartado":null,"categoriaCompleta":"Autos","fechaPublicacion":"21-11-2020","numeroBoletin":271,"paginas":2,"tamano":308.95,"numAccesos":27},{"id":789294,"historico":false,"sumario":"Despido objetivo individual 221/2020.","numero":6627,"ano":2020,"anunciante":"Servicio Común Procesal de Ordenación del Procedimiento Social de Murcia","subAnunciante":"De lo Social número Cinco de Murcia","apartado":"III. Administración de Justicia","subApartado":null,"categoriaCompleta":"Despidos/Ceses","fechaPublicacion":"21-11-2020","numeroBoletin":271,"paginas":3,"tamano":313.77,"numAccesos":21},{"id":789295,"historico":false,"sumario":"Procedimiento 518/2020.","numero":6628,"ano":2020,"anunciante":"De lo Social número Tres de Las Palmas de Gran Canaria","subAnunciante":"","apartado":"III. Administración de Justicia","subApartado":null,"categoriaCompleta":"Autos","fechaPublicacion":"21-11-2020","numeroBoletin":271,"paginas":1,"tamano":302.58,"numAccesos":23}]}

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM