2017-09-04 2 views
-2

Mein Ziel ist ein Python-Skript schreiben, die bestimmte Daten von einer Website abrufen können. speziell muss ich diese Daten extrahieren:Python Beasesoup Ich kann nicht auf CSV-Datei schreiben

<span class="street-address" itemprop="streetAddress">191, Corso Peschiera</span> 

und

<div itemprop="telephone" class="tel elementPhone">0184 662271</div> 

nur die Nummer und die Adresse natürlich!

während ich versuche, einfach 'div' oder 'a' oder 'href' zu extrahieren, habe ich keine Probleme, aber ich bin nicht in der Lage, meine Forschung zu verbessern.

hier ist mein Code .... Ich bin auf Datei schreiben nicht in der Lage, wenn ich nur ein Argument wie soup.find_all ('a')

from bs4 import BeautifulSoup 
import requests 

r = requests.get('https://www.paginegialle.it/ricerca/lidi%20balneari/Torino?') 
data = r.text 
soup = BeautifulSoup(data,"html.parser") 
dia = soup.find_all('<div itemprop="telephone" class="tel elementPhone"></div>') 

for link in soup.find_all('<div itemprop="telephone" class="tel elementPhone"></div>'): 
    print (dia) 

documento=open("mbsprovalive.csv","w") 
    documento.write(dia) 
     documento.close() 

ty Hilfe passieren BS4 !! !

+0

Woher hast du gelesen, dass 'soup.find_all ('

')' funktionieren würde? Haben Sie sich den Rückgabewert dieses Anrufs angesehen? Haben Sie sich die Dokumentation angesehen? – Tomalak

+0

Beginnen Sie mit dem Lesen der Dokumentation: https://www.crummy.com/software/BeautifulSoup/bs4/doc/#find-all. Das erste positionale Argument für 'find_all()' ist der Tag-Name, nicht irgendein HTML-Snippet. Um basierend auf Attributen zu filtern, übergeben Sie geeignete Schlüsselwortargumente oder ein Diktat als "attrs" arg. –

+0

@Tomalak Durch die Dokumentation konnte ich ein Skript erstellen, das alle "div" oder alle "a" finden kann, aber keinen komplexeren Ausdruck, wie ich in der Antwort angegeben habe. –

Antwort

0

könnten Sie bs4 ‚s attrs Feld verwenden, um genau zu bestimmen, welche Klasse von Ihrem Interesse ist so wie:

#!/usr/bin/env python 

from bs4 import BeautifulSoup 
import requests 

data = requests.get('your url here').text 
soup = BeautifulSoup(data,"html.parser") 

for i,j in zip(soup.find_all('span', attrs={'class':'street-address'}), soup.find_all('div', attrs={'class':'tel elementPhone'})): 
    print i.text, j.text 

Diese Arbeit soll!

+0

hi @ coder! ty für Hilfe! Dies ist die Ausgabe von >>> BS4 import BeautifulSoup >>> Importanforderungen >>> >>> data = requests.get ('https://www.paginegialle.it/ricerca/lidi%20balneari/Roma% 20 (RM)? '). Text >>> suppe = BeautifulSoup (daten, "html.parser") >>> >>> für i, j in zip (supp.find_all (' span ', attrs = {'class': 'street-address'}), supp.find_all ('div', attrs = {'class': 'tel elementPhone'})): ... drucken (i.text, j.text) ... Traceback (jüngste Aufforderung zuletzt): File "", Zeile 2, in Typeerror: 'NoneType' Objekt ist nicht aufrufbar –

+0

ich Ihren Code ausführen und kein Problem konfrontiert. Das Problem ist, dass wenn Sie 'Requests' Modul in Python verwenden, Sie nie den ** http ** Teil von der URL weglassen sollten. Also, indem Sie Daten definieren als: 'data = requests.get ('https://www.paginegialle.it/ricerca/lidi%20balneari/Roma%20 (RM)?% 27') .text' Sie sollten keine haben Problem! – coder

0
from bs4 import BeautifulSoup 
import requests 
import csv 
r = requests.get('https://www.paginegialle.it/ricerca/pizzerie/Milano? 
mr=50') 
data = r.text 
soup = BeautifulSoup(data,"html.parser") 
with open('mbsprprova.csv', 'w') as csvfile: 
fieldnames = ['nome','indirizzo','telefono'] 
writer=csv.DictWriter(csvfile, fieldnames=fieldnames) 
for i,j,z in zip(soup.find_all('span', attrs={'class':'street-address'}), 
soup.find_all('div', attrs={'class':'tel 
elementPhone'}),soup.find_all('span', 
attrs={'itemprop':'name'})): 
    writer.writeheader() 
    writer.writerow({'nome':z.text,'telefono': j.text,'indirizzo':i.text}) 

Hier funktioniert der Code einwandfrei. Es gibt nur ein paar lästige Formatierungsprobleme. dank an alle für hilfe .... ich bin traurig für die downvotes wie ich sagte ich bin noob und ich suchte nach Antworten viel vor dem Posten. :)

Verwandte Themen