Al escribir las páginas que se arrastran una etiqueta bajo el atributo href, cuando hay un problema de este tipo, si no hay atributo href se produce este error bajo una etiqueta, como sigue:
Baidu tiene un maestro con un partido regular, no cómo el método buena sensación, compruebe el documento oficial BeautifulSoup encontró una manera buena, como se muestra a continuación:
El documento oficial de enlace: https: //beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
El has_attr () Este método se puede determinar si existe una propiedad de una etiqueta, si está presente, devuelve True
solución:
Para el uso estético de funciones anónimas
soup_a = soup.find_all (tag lambda: tag.has_attr ( 'href'))
El código final:
1 # / usr / bin / env python! 2 # - * - codificación: utf-8 - * - 3 # Autor: Riy 4 5 importación tiempo 6 de importación solicitudes 7 importación sys 8 importación de registro 9 de BS4 importación BeautifulSoup 10 de peticiones. excepciones importar RequestException 11 de multiprocesamiento importación Proceso, piscina 12 13 14 logging.basicConfig ( 15 nivel = logging.DEBUG, 16 format = ' % (levelname) -10S:% (mensaje) s ' , 17 ) 18 19 20 clase down_url: 21 def descarga (self, url): 22 ''' 爬取url '' ' 23 try : 24 start = time.time () 25 logging.debug ( ' iniciar descarga url ... " ) el 26 de respuesta = requests.get (url) 27 page = response.content 28 sopa = BeautifulSoup (página, ' lxml ' ) 29 soup_a = soup.find_all ( lambda etiqueta: tag.has_attr ( ' href ' )) 30 soup_a_href_list = [] 31 # de impresión (soup_a) 32 para k en soup_a: 33 # de impresión (k) 34 soup_a_href = k [ ' href ' ] 35 si soup_a_href.find ( ' ' ): 36 # impresión (soup_a_href) 37 soup_a_href_list.append (soup_a_href) 38 de impresión (f ' 运行了{time.time () - inicio}秒' ) 39 , excepto RecursionError como e: 40 de impresión (e) 41 de retorno soup_a_href_list 42 43 44 def escritura ( soup_a_href_list, txt): 45 '' ' 下载到txt文件''' 46 logging.debug ( ' a partir de escritura txt ... ' ) 47 con txt abierto (, ' un ' , encoding =' UTF-8. ' ) Como F: 48 para que en soup_a_href_list: 49 f.writelines (F ' {I} \ n ' ) 50 Imprimir (F ' archivo TXT generado} { ' ) 51 es 52 es 53 es DEF help_memo (Ser) : 54 '' ' Ver ayuda ' '' 55 Imprimir ( '' ' 56 es -H o ayuda cheque --help 57 es -u o --url Añadir URL 58 archivo txt -t está escrito o --txt 59 ' '') 60 61 es 62 es DEF disponibles para su compra (Ser): 63 es '' ' página de bienvenida ' '' 64 desc = ( ' Bienvenido arrastrándose guión url ' .center (30, ' * ' )) 65 Imprimir (desc) 66 67 68 DEF principal ( ): 69 '' ' función principal ' '' 70 . P = la piscina (3 ) 71 es P_LIST = [] 72 TEMP = down_url () 73 es logging.debug ( ' A partir Python ... RUN ') 74 probar : 75 si len (sys.argv) == 1 : 76 temp.welcome () 77 temp.help_memo () 78 elif sys.argv [1] en { ' -h ' , ' --help ' }: 79 temp .help_memo () 80 elif sys.argv [1] en { ' -u ' , ' --url ' } y sys.argv [3] en { ' -t ' , '--txt ' }: 81 a = temp.download (sys.argv [2 ]) 82 temp.write (a, sys.argv [4 ]) 83 elif sys.argv [1] en { ' -t ' ' --txt ' }: 84 de impresión ( ' 请先输入url! ' ) 85 elif sys.argv [1] en { ' -u ' ' --url ' }: 86 url_list = sys.argv [2 :] 87 impresión(url_list) 88 para i en url_list: 89 a = p.apply_async (temp.download, args = (i,)) 90 p_list.append (a) 91 por p en p_list: 92 de impresión (p.get ()) 93 otra cosa : 94 temp.help_memo () 95 96 print ( ' 输入的参数有误! ' ) 97 , salvo excepciones como el correo: 98 de impresión (e) 99 temp.help_memo () 100 101 102 si __name__ == ' __main__ ' : 103 main ()