2017-07-06 2 views
0

Normalerweise kann ich ein Skript schreiben, das für Scraping funktioniert, aber ich habe einige Schwierigkeiten haben, diese Website für die Tabelle angeworben für dieses Forschungsprojekt, an dem ich arbeite, zu kratzen. Ich plane, das Skript, das an einem Status arbeitet, zu verifizieren, bevor ich die URL meiner Zielzustände eingib.Problem Scraping-Site mit BS4

import requests 
import bs4 as bs 

url = ("http://programs.dsireusa.org/system/program/detail/284") 
dsire_get = requests.get(url) 
soup = bs.BeautifulSoup(dsire_get.text,'lxml') 
table = soup.findAll('div', {'data-ng-controller': 'DetailsPageCtrl'}) 
print(table) 
#I'm printing "Table" just to ensure that the table information I'm looking for is within this sections 

Ich bin nicht sicher, ob die Website die Menschen daran zu hindern, Schaben versucht, aber alle Informationen, die ich greifen bin auf der Suche nach ist innerhalb „& quot“, wenn Sie schauen, was Tabelle Ausgänge.

+0

Haben Sie "html.parser" anstelle von "lxml" probiert? – martinB0103

+0

Welchen Teil der Seite möchten Sie? Der Teil mit der Überschrift "Programmübersicht"? Oder der eine Leiter "Behörden"? Oder etwas anderes? –

+0

@BillBell Ich bin auf der Suche nach der "Programmübersicht" – vlepore

Antwort

0

So endlich habe ich es geschafft, das Problem zu lösen, und successfuly die Daten aus der Javascript-Seite den Code greifen wie für mich gearbeitet folgt, wenn jemand eine gleiche Problem begegnet, wenn sie versuchen, Verwenden Sie Python, um eine Javascript-Webseite mit Windows zu scrappen (dryscrape inkompatibel).

import bs4 as bs 
from selenium import webdriver 
from selenium.common.exceptions import NoSuchElementException 
from selenium.webdriver.common.keys import Keys 
browser = webdriver.Chrome() 
url = ("http://programs.dsireusa.org/system/program/detail/284") 
browser.get(url) 
html_source = browser.page_source 
browser.quit() 
soup = bs.BeautifulSoup(html_source, "html.parser") 
table = soup.find('div', {'class': 'programOverview'}) 
data = [] 
for n in table.findAll("div", {"class": "ng-binding"}): 
    trip = str(n.text) 
    data.append(trip) 
1

Der Text wird mit JavaScript gerendert. zuerst die Seite mit dryscrape

machen (Wenn Sie nicht wollen, verwenden dryscrape sehen Web-scraping JavaScript page with Python) es

Dann kann der Text extrahiert werden, nachdem gemacht wurde, aus einer anderen Position auf der Seite, dh die Ort, an dem es gerendert wurde.

Als Beispiel wird dieser Code HTML aus der Zusammenfassung extrahieren.

import bs4 as bs 
import dryscrape 

url = ("http://programs.dsireusa.org/system/program/detail/284") 
session = dryscrape.Session() 
session.visit(url) 
dsire_get = session.body() 
soup = bs.BeautifulSoup(dsire_get,'html.parser') 
table = soup.findAll('div', {'class': 'programSummary ng-binding'}) 
print(table[0]) 

Ausgänge:

<div class="programSummary ng-binding" data-ng-bind-html="program.summary"><p> 
<strong>Eligibility and Availability</strong></p> 
<p> 
Net metering is available to all "qualifying facilities" (QFs), as defined by the federal <i>Public Utility Regulatory Policies Act of 1978</i> (PURPA), which pertains to renewable energy systems and combined heat and power systems up to 80 megawatts (MW) in capacity. There is no statewide cap on the aggregate capacity of net-metered systems.</p> 
<p> 
All utilities subject to Public ... 
+0

obwohl dies aussieht, würde es funktionieren, dryscrape unterstützt offiziell keine Windows, also kann ich das nicht benutzen. Ich werde dem Weg folgen, den Sie in diesem Post ohne Dryscape angegeben haben. – vlepore

+0

Deshalb habe ich den Link eingefügt. Ob Sie Dryscrape, Selenium, PyQt oder irgendetwas anderes verwenden, die Methodik ist die gleiche. –