2016-04-24 15 views
1

Ich arbeite an einer Aufgabe, in der ich einen Web-Crawler erstellen soll, der eine Eingabe-URL liest, jeden Link auf der Seite besucht und die Titel der Seiten druckt. Ich habe nicht viel Erfahrung mit Python, aber ich hatte etwas Hilfe, lesen Sie durch eine Menge von anderen Programmen Leute geschrieben haben, und derzeit haben diese:Wie finden und drucken Sie die Seitentitel von HTML-Links von einer URL in Python 3.5?

from html.parser import HTMLParser 
import urllib.request 

class parseText(HTMLParser): 
def handle_starttag(self, tag, attrs): 
    print("Start tag:", tag) 
    for attr in attrs: 
     print("  attr:", attr) 
     if tag == "href" in attrs: 
      print(tag) 

pageParse = parseText() 

req = urllib.request.Request('http://schoolcraft.edu') 

pageRequest = urllib.request.urlopen(req) 
pageRequestString = pageRequest.read().decode() 
pageParse.feed(pageRequestString) 
pageParse.close() 
for item in urlText: 
    print (item) 

So weiß ich, dass sie alle die Druckerei Website-Attribute, anstatt nur den Titel, aber ich bin mir nicht sicher, wie man nur den Titel druckt. Kann ich das HTMLParser-Modul weiterhin verwenden?

Jede Hilfe ist willkommen.

EDIT:

habe ich versucht, die BeautifulSoup Code @Padraic in python35.exe geschrieben und ich bekam die folgende

Screencap1

Screencap2

Ich änderte soup = BeautifulSoup(urllib.request.urlopen(base).read()) zu soup = BeautifulSoup(urllib.request.urlopen(base).read(), "html.parser") und soup = BeautifulSoup(urllib.request.urlopen(url).read())-soup = BeautifulSoup(urllib.request.urlopen(url).read(), "html.parser") . Dies brachte mich dazu, das gleiche zu bekommen, aber ohne den ersten Fehler, der mir sagte "html.parser" hinzuzufügen.

+0

Do Sie müssen eingebaute Bibliotheken verwenden? Sie würden auch wollen, wenn "href" in attr: 'nicht' wenn Tag == "href" in attrs ' –

+0

Mein Professor sagte nicht, also glaube ich nicht. –

+0

Wir können es mit html.parser tun, aber es ist viel einfacher mit bs4 –

Antwort

1

Sie müssen alle hrefs ziehen und sie an die Basis-URL zu verbinden, können Sie dann jede Seite besuchen und den Titel BeautifulSoup mit Druck:

from urllib.parse import urljoin 
import urllib.request 
from bs4 import BeautifulSoup 

def print_titles(): 
    base = "http://schoolcraft.edu" 
    soup = BeautifulSoup(urllib.request.urlopen(base).read()) 
    for href in (a["href"] for a in soup.select("a[href]")): 
     url = urljoin(base, href) 
     soup = BeautifulSoup(urllib.request.urlopen(url).read()) 
     title = soup.title 
     if title: 
      print(title.text.strip()) 


print_titles() 

soup.select("a[href]") werden alle Anker-Tags finden, die href Attribute Von der ersten Seite, dann iterieren wir über jeden zurückgegebenen und verbinden ihn mit der Basis usl mit url = urljoin(base, href), wir besuchen jeden Link und drucken den Titeltext, falls verfügbar.

Eine Probe des Ausgangs:

Schoolcraft College 
Schoolcraft College 
Blackboard Learn 
Missing cookie 
Calendar - Schoolcraft College 
A-Z Index - Schoolcraft College 
Stay Connected - Schoolcraft College 
Schoolcraft College 
About Us - Schoolcraft College 
Campus Life - Schoolcraft College 
Admissions - Schoolcraft College 
Resources - Schoolcraft College 
Academics - Schoolcraft College 
News and Events - Schoolcraft College 

Mit HTMLParser, können Sie es leichter, die Links zu analysieren und den Titel separat finden, werden Sie auch doppelte Links behandeln müssen:

from html.parser import HTMLParser 
import urllib.request 
from urllib.parse import urljoin 
import urllib.request 


class HrefParser(HTMLParser): 
    def handle_starttag(self, tag, attrs): 
     for _tag, data in attrs: 
      if tag == "a" and "href" == _tag: 
       url = urljoin('http://schoolcraft.edu', data) 
       p = ParseTitle() 
       p.feed(urllib.request.urlopen(url).read().decode()) 
       print(p.title) 


class ParseTitle(HTMLParser): 
    def __init__(self): 
     super().__init__() 
     self.title = "" 
     self.found = None 

    def handle_starttag(self, tag, attrs): 
     if tag == "title": 
      self.found = True 

    def handle_data(self, data): 
     if self.found and not self.title: 
      self.title = data.strip() 
      return 


pageParse = HrefParser() 

pageRequest = urllib.request.urlopen('http://schoolcraft.edu') 

pageRequestString = pageRequest.read().decode() 
pageParse.feed(pageRequestString) 

pageParse.close() 
+0

Wie bekomme ich BeautifulSoup funktioniert? Ich habe 'pip install beautifulsoup4' versucht, aber ich bekomme' Anforderung bereits erfüllt (benutze --upgrade zum upgrade): beautifulsoup4 in c: \ users \ brust \ appdata \ local \ programme \ python \ python35 \ lib \ site -Packungen ". Bedeutet das, dass ich es upgraden muss? –

+0

@RCate, Sie können nicht bs4 importieren? –

+0

Nein, ich bekomme 'ImportError: kann den Namen 'BeautifulSoup' nicht importieren, wenn ich versuche, das von Ihnen gepostete Programm auszuführen. –

Verwandte Themen