Estoy tratando de obtener todos los enlaces a los artículos (que tienen la clase 'title may-blank' para denotarlos). Estoy tratando de averiguar por qué el siguiente código genera un montón de "href =" cuando lo ejecuto, en lugar de volver con la URL real. También recibo un montón de texto aleatorio y enlaces después de las URL de los 25 artículos fallidos (todos 'href ='), pero no estoy seguro de por qué sucede, ya que debería detenerse después de que deje de encontrar la clase 'título may-blank'. ¿Pueden ayudarme a descubrir qué pasa?

import urllib2

def get_page(page):

    response = urllib2.urlopen(page)
    html = response.read()
    p = str(html)
    return p

def get_next_target(page):
    start_link = page.find('title may-blank')
    start_quote = page.find('"', start_link + 4)
    end_quote = page.find ('"', start_quote + 1)
    aurl = page[start_quote+1:end_quote] # Gets Article URL
    return aurl, end_quote

def print_all_links(page):
    while True:
        aurl, endpos = get_next_target(page)
        if aurl:
            print("%s" % (aurl))
            print("")
            page = page[endpos:]
        else:
            break

reddit_url = 'http://www.reddit.com/r/worldnews'

print_all_links(get_page(reddit_url))
0
Phillipe Dongwoo Han 2 sep. 2014 a las 11:52

2 respuestas

La mejor respuesta

Rawing es correcto, pero cuando enfrento un Problema XY Prefiero proporcionar la mejor manera de lograr X en lugar de una forma de arreglar Y. Debe usar un analizador HTML como BeautifulSoup para analizar páginas web :

from bs4 import BeautifulSoup
import urllib2

def print_all_links(page):
    html = urllib2.urlopen(page).read()
    soup = BeautifulSoup(html)
    for a in soup.find_all('a', 'title may-blank ', href=True):
        print(a['href'])

Si eres realmente alérgico al analizador HTML, al menos usa regex (incluso si debes seguir el análisis HTML):

import urllib2
import re

def print_all_links(page):
    html = urllib2.urlopen(page).read()
    for href in re.findall(r'<a class="title may-blank " href="(.*?)"', html):
        print(href)
1
Community 23 may. 2017 a las 12:32

Eso es porque la linea

start_quote = page.find('"', start_link + 4)

No hace lo que crees que hace. start_link se establece en el índice de "título en blanco". Por lo tanto, si realiza una búsqueda de página en start_link + 4, en realidad comienza a buscar en "e may-blank". Si cambias

start_quote = page.find('"', start_link + 4)

Para

start_quote = page.find('"', start_link + len('title may-blank') + 1)

Funcionará.

0
Aran-Fey 2 sep. 2014 a las 08:13