Estoy tratando de raspar un corpus de noticias para su análisis. Tengo un archivo de texto con una lista de URL y estoy tratando de pasarlos a las solicitudes para que la página se pueda eliminar con BeautifulSoup. Puedo extraer las URL del archivo de texto. Sin embargo, no estoy pasando correctamente esa salida a request.get (). Cuando le doy a request.get () una url explícita, el script funciona bien. ¿Cómo paso correctamente a request.get () una lista de enlaces de un archivo de texto? Esto es lo que tengo funcionando.

import requests
from bs4 import BeautifulSoup
r = requests.get("https://examplewebsite.org/page1")
coverpage = r.content
soup = BeautifulSoup(coverpage, 'html5lib')
file = open("output.txt", "w")
file.write("ITEM:")
paragraphs = soup.find_all("p")[11:-10]
for paragraph in paragraphs:
    file.write(paragraph.get_text())
    file.write("\n")
    file.write("\n")
file.close()

Sin embargo, cuando trato de leer un archivo de texto que es una lista de enlaces, parece haber un problema con la forma en que paso los enlaces a request.get (). Con una URL por línea, la lista de enlaces del archivo de texto se ve como

https://examplewebsite.org/page1
https://examplewebsite.org/page2
https://examplewebsite.org/page3
https://examplewebsite.org/page4

Así es como estoy tratando de trabajar a través de la lista de enlaces.

f = open('article-list.txt', 'r')
urls = list(f)
for url in urls:
    import requests
    from bs4 import BeautifulSoup
    r = requests.get(url)
    coverpage = r.content
    soup = BeautifulSoup(coverpage, 'html5lib')
    file = open("output.txt", "w")
    file.write("ITEM:")
    paragraphs = soup.find_all("p")[11:-10]
    for paragraph in paragraphs:
        file.write(paragraph.get_text())
        file.write("\n")
        file.write("\n")
        print(paragraph.get_text())
file.close()

Lo que obtengo es un error que dice

AttributeError: 'NoneType' object has no attribute 'get_text'

Esto me sugiere que no estoy pasando la solicitud correctamente. Si simplemente cambio una url definida explícitamente como "https://somewebsite.org/page1", entonces el script funciona y escribe párrafos en el archivo. Sin embargo, cuando pongo una declaración print(urls) en la parte superior y le doy a peticiones.get () un enlace explícito para que no se rompa, obtengo una lista de URL. Sin embargo, esa lista está formateada como:

['http://examplewebsite.org/page1 \ n', 'http://examplewebsite.org/page2 \ n ',' http://examplewebsite.org/page3 \ n ']

Creo que \ n es el problema. Traté de ejecutar los enlaces todos juntos y eso no funcionó. También para facilitar la lectura, preferiría tener cada enlace en una línea separada. Cualquier sugerencia sobre cómo abordar esto sería muy apreciada. Gracias.

0
N.Craig 25 abr. 2020 a las 22:06

2 respuestas

La mejor respuesta

Eliminar "\ n" con el uso de .rstrip () resolvió el problema. El siguiente código funciona y escribe correctamente un grupo de noticias en un solo archivo de texto.

import requests
from bs4 import BeautifulSoup

f = open('article-list.txt', 'r')
urls_n = list(f)
urls = [url.rstrip("\n") for url in urls_n]

for url in urls:
    import requests
    from bs4 import BeautifulSoup
    r = requests.get(url)
    coverpage = r.content
    soup = BeautifulSoup(coverpage, 'html5lib')
    file = open("output.txt", "a")
    file.write("ITEM:")
    paragraphs = soup.find_all("p")[11:-10]
    for paragraph in paragraphs:
        file.write(paragraph.get_text())
        file.write("\n")
        file.write("\n")
        print(paragraph.get_text())
file.close()
0
N.Craig 26 abr. 2020 a las 16:23

Para obtener la lista tal como están en el archivo, esta línea

urls = list(f)

Debería verse así

urls = f.readlines()

Devolverá una matriz de cada línea en el archivo txt sin ningún "\ n"

0
Holden 25 abr. 2020 a las 19:09