2016-04-28 5 views
1

Ich verwende lxml.html ModulPython3 Schaber. Analysiert keine XPath bis zum Ende

from lxml import html 

page = html.parse('http://directory.ccnecommunity.org/reports/rptAccreditedPrograms_New.asp?sort=institution') 

# print(page.content) 

unis = page.xpath('//tr/td[@valign="top" and @style="width: 50%;padding-right:15px"]/h3/text()') 

print(unis.__len__()) 

with open('workfile.txt', 'w') as f: 
    for uni in unis: 
     f.write(uni + '\n') 

Die Website hier (http://directory.ccnecommunity.org/reports/rptAccreditedPrograms_New.asp?sort=institution#Z) ist voll von Universitäten.

Das Problem ist, dass es bis zum Buchstaben "H" (244 Unis) analysiert. Ich kann nicht verstehen, warum, wie ich sehe es bis zum Ende alle HTML analysiert.

Ich dokumentierte auch mein Selbst, dass 244 keine Begrenzung einer Liste oder irgendetwas in python3 ist.

+0

Betrachten wir mit 'requests' und' beautifulsoup4'? – taesu

+0

das gleiche, wie ich schon sagte, es analysiert das HTML bis zum Ende. So ist das Problem nicht in der Anfragefunktion, die ich verwende. –

Antwort

1

Diese HTML-Seite ist einfach nicht HTML, es ist total kaputt. Aber das Folgende wird tun, was Sie wollen. Es verwendet den Parser BeautifulSoup.

from lxml.html.soupparser import parse 
import urllib 

url = 'http://directory.ccnecommunity.org/reports/rptAccreditedPrograms_New.asp?sort=institution' 
page = parse(urllib.request.urlopen(url)) 
unis = page.xpath('//tr/td[@valign="top" and @style="width: 50%;padding-right:15px"]/h3/text()') 

Weitere Informationen finden Sie unter http://lxml.de/lxmlhtml.html#really-broken-pages.

+0

ist es für python3? Ursache Es identifiziert die URLopen-Funktion nicht. –

+0

Sorry, getestet mit Python 2. Für Python 3 müssen Sie 'request' hinzufügen. Antwort aktualisiert Beachten Sie jedoch, dass Sie möglicherweise ein anderes Problem mit lxml haben: 'NameError: name 'unichr' ist nicht definiert. Dies ist in späteren lxml-Versionen behoben (siehe http://lxml.de/api/lxml.html.soupparser-pysrc. HTML als Referenz). – Markus

+0

BTW, um XPath Ausdruck weniger abhängig von der Formatierung zu machen, sollten Sie stattdessen '// tr/td/h3 [folgende-Geschwister :: br]/text()' stattdessen verwenden. – Markus

1

Für Web-Scraping empfehle ich Ihnen BeautifulSoup 4 Mit BS4 zu verwenden, um dies leicht getan:

from bs4 import BeautifulSoup 
import urllib.request 

universities = [] 
result = urllib.request.urlopen('http://directory.ccnecommunity.org/reports/rptAccreditedPrograms_New.asp?sort=institution#Z') 

soup = BeautifulSoup(result.read(),'html.parser') 

table = soup.find_all(lambda tag: tag.name=='table') 
for t in table: 
    rows = t.find_all(lambda tag: tag.name=='tr') 
    for r in rows: 
     # there are also the A-Z headers -> check length 
     # there are also empty headers -> check isspace() 
     headers = r.find_all(lambda tag: tag.name=='h3' and tag.text.isspace()==False and len(tag.text.strip()) > 2) 
     for h in headers: 
      universities.append(h.text) 
Verwandte Themen