python - from - Cómo iterar a través de páginas de resultados múltiples cuando raspa la web con Beautiful Soup
how to use beautifulsoup4 (1)
Prueba esto:
from urllib.request import urlopen
from bs4 import BeautifulSoup
#all_letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o","p","q","r","s","t","u","v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
all_letters= [''x'']
pages = []
def get_url(letter, page_number):
return "https://www.co.dutchess.ny.us/CountyClerkDocumentSearch/Search.aspx?q=nco1%253d2%2526name1%253d" + letter + "&page=" + str (page_number)
def list_names(soup):
nameList = soup.findAll("td", {"class":"party-name"})
for name in nameList:
print(name.get_text())
def get_soup(letter, page):
url = get_url(letter, page)
html = urlopen(url)
return BeautifulSoup(html)
def main():
for letter in all_letters:
bsObj = get_soup(letter, 1)
sel = bsObj.find(''select'', {"name": "ctl00$ctl00$InternetApplication_Body$WebApplication_Body$SearchResultPageList1"})
for opt in sel.findChildren("option", selected = lambda x: x != "selected"):
pages.append(opt.string)
list_names(bsObj)
for page in pages:
bsObj = get_soup(letter, page)
list_names(bsObj)
main()
En la función main()
, desde la primera página get_soup(letter, 1)
encontramos y almacenamos en una lista los valores de opciones de selección que contienen todos los números de página.
A continuación, recorremos los números de página para extraer datos de las páginas siguientes.
Tengo un script que he escrito donde uso Beautiful Soup para raspar un sitio web para buscar resultados. He logrado aislar los datos que quiero a través de su nombre de clase.
Sin embargo, los resultados de búsqueda no están en una sola página. En cambio, están repartidas en varias páginas, así que quiero obtenerlas todas. Quiero que mi script pueda verificar si hay una próxima página de resultados y ejecutarse allí también. Dado que los resultados varían en número, no sé cuántas páginas de resultados existen, por lo que no puedo predefinir un rango para iterar. También he intentado usar una verificación ''if_page_exists''. Sin embargo, si pongo un número de página que está fuera de los rangos de resultados, la página siempre existe, simplemente no tiene ningún resultado pero tiene una página que dice que no hay resultados para mostrar.
Sin embargo, lo que he notado es que cada resultado de página tiene un enlace ''Siguiente'' que tiene el id ''NextLink1'' y el resultado de la última página no tiene esto. Entonces creo que esa es la magia. Pero no sé cómo ni dónde implementar ese cheque. He estado recibiendo bucles infinitos y esas cosas.
El siguiente script encuentra los resultados para el término de búsqueda ''x''. La asistencia sería muy apreciada.
from urllib.request import urlopen
from bs4 import BeautifulSoup
#all_letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o","p","q","r","s","t","u","v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
all_letters= [''x'']
for letter in all_letters:
page_number = 1
url = "https://www.co.dutchess.ny.us/CountyClerkDocumentSearch/Search.aspx?q=nco1%253d2%2526name1%253d" + letter + "&page=" + str (page_number)
html = urlopen(url)
bsObj = BeautifulSoup(html)
nameList = bsObj.findAll("td", {"class":"party-name"})
for name in nameList:
print(name.get_text())
Además, ¿alguien sabe una manera más corta de instanciar una lista de caracteres alfanuméricos que sea mejor que la que comenté en el guión anterior?