Solución de raspado web de Python

Por lo tanto, soy nuevo en Python y estoy tratando de desarrollar un ejercicio en el que elimine los números de página de una lista en esta URL, que es una lista de varios artículos publicados.

Cuando entro en el elemento HTML de la página que quiero raspar, inspecciono el elemento y encuentro este código HTML para hacer coincidir:

Foreign Affairs, Vol. 79, No. 4 (Jul. - Aug., 2000), pp. 53-63

La parte que quiero para producir lo que está entre los corchetes de la clase. Esto es lo que intenté escribir para hacer el trabajo.

 import requests from bs4 import BeautifulSoup url = "http://www.jstor.org/action/doAdvancedSearch?c4=AND&c5=AND&q2=&pt=&q1=nuclear&f3=all&f1=all&c3=AND&c6=AND&q6=&f4=all&q4=&f0=all&c2=AND&q3=&acc=off&c1=AND&isbn=&q0=china+&f6=all&la=&f2=all&ed=2001&q5=&f5=all&group=none&sd=2000" r = requests.get(url) soup = BeautifulSoup(r.content) links = soup.find_all("div class='src'") for link in links: print 

Sé que este código no está terminado y eso es porque no sé a dónde ir desde aquí:. ¿Puede alguien ayudarme aquí?

Si te entiendo correctamente, querrás las páginas dentro de todos los divs con class = “src”

Si es así, entonces tienes que hacer:

 import requests import re from bs4 import BeautifulSoup url = "http://www.jstor.org/action/doAdvancedSearch?c4=AND&c5=AND&q2=&pt=&q1=nuclear&f3=all&f1=all&c3=AND&c6=AND&q6=&f4=all&q4=&f0=all&c2=AND&q3=&acc=off&c1=AND&isbn=&q0=china+&f6=all&la=&f2=all&ed=2001&q5=&f5=all&group=none&sd=2000" r = requests.get(url) soup = BeautifulSoup(r.content) links = soup.find_all('div', {'class':'src'}) for link in links: pages = re.search('(pp.\s*\d*-\d*)', link.text) print pages.group(1) 

Tenga en cuenta que he usado expresiones regulares para obtener los números de página. Esto puede sonar extraño para las personas que no están familiarizadas con las expresiones regulares, pero creo que es más elegante que usar operaciones de cuerdas como strip y split

Una alternativa a la respuesta de Tales Pádua es esta:

 from bs4 import BeautifulSoup html = """
Foreign Affairs, Vol. 79, No. 4 (Jul. - Aug., 2000), pp. 53-63
Other Book, Vol. 1, No. 1 (Jul. - Aug., 2000), pp. 1-23
""" soup = BeautifulSoup(html) links = soup.find_all("div", class_ = "src") for link in links: print link.text.strip()

Esto produce:

 Foreign Affairs, Vol. 79, No. 4 (Jul. - Aug., 2000), pp. 53-63 Other Book, Vol. 1, No. 1 (Jul. - Aug., 2000), pp. 1-23 

Esta respuesta utiliza el parámetro class_ , que se recomienda en la documentación.


Si desea obtener el número de página y todo sigue el formato anterior (separados por comas), puede cambiar el bucle for para capturar el último elemento de la cadena:

 print link.text.split(",")[-1].strip() 

Esto produce:

 pp. 53-63 pp. 1-23