2016-08-30 1 views
1

Ich habe einige Probleme mit dem, was als versteckte Zeilenumbruch Zeichen in Strings mit der BeautifulSoup .find-Funktion erhalten haben. Der Code, den ich habe, scannt ein HTML-Dokument und zieht Name, Titel, Firma und Land als Zeichenketten heraus. Ich tippte ein und sah, dass es sich um Saiten handelte, und wenn ich sie drucke und ihre Länge überprüfe, sieht alles wie normale Saiten aus. Aber wenn ich sie entweder in print("%s is a %s at %s in %s" % (name,title,company,country)) oder outputWriter.writerow([name,title,company,country]) schreibe, um in eine CSV-Datei zu schreiben, bekomme ich zusätzliche Zeilenumbrüche, die anscheinend nicht in den Strings vorhanden sind.BeautifulSoup Hinzufügen von unerwünschten Zeilenumbrüche zu Strings Python3.5

Was ist los? Oder kann mir jemand in die richtige Richtung zeigen?

Ich bin neu bei Python und nicht sicher, wo ich alles nachschlagen kann, was ich nicht weiß, also frage ich hier, nachdem ich den ganzen Tag damit verbracht habe, das Problem zu beheben. Ich habe über Google und einige andere Stapelüberlauf-Artikel nach Strippen versteckter Charaktere gesucht, aber nichts scheint zu funktionieren.

import csv 
from bs4 import BeautifulSoup 

# Open/create csvfile and prep for writing 
csvFile = open("attendees.csv", 'w+', encoding='utf-8') 
outputWriter = csv.writer(csvFile) 

# Open HTML and Prep BeautifulSoup 
html = open('WEB SUMMIT _ LISBON 2016 _ Web Summit Featured Attendees.html', 'r', encoding='utf-8') 
bsObj = BeautifulSoup(html.read(), 'html.parser') 
itemList = bsObj.find_all("li", {"class":"item"}) 

outputWriter.writerow(['Name','Title','Company','Country']) 

for item in itemList: 
    name = item.find("h4").get_text() 
    print(type(name)) 
    title = item.find("strong").get_text() 
    print(type(title)) 
    company = item.find_all("span")[1].get_text() 
    print(type(company)) 
    country = item.find_all("span")[2].get_text() 
    print(type(country)) 
    print("%s is a %s at %s in %s" % (name,title,company,country)) 
    outputWriter.writerow([name,title,company,country]) 
+0

Ich löste mein Problem, einen weiteren Filter zu versuchen. def filter_non_printable (str): return '' .join ([c für c in str wenn ord (c)> 31 oder ord (c) == 9]) – gsears

Antwort

0

Höchstwahrscheinlich werden Sie zu Streifen benötigen das Leerzeichen, gibt es nichts in Ihrem Code, der es fügt, so dass es dort zu sein hat:

outputWriter.writerow([name.strip(),title.strip(),company.strip(),country.strip()]) 

Sie können überprüfen, was uns dort durch das sehende repr outpout:

print("%r is a %r at %r in %r" % (name,title,company,country)) 

Wenn Sie Druck yo u siehe str Ausgang so, wenn es ein Newline ist, kann man es nicht erkennen, gibt es:

In [8]: s = "string with newline\n" 

In [9]: print(s) 
string with newline 


In [10]: print("%r" % s) 
'string with newline\n' 

difference-between-str-and-repr-in-python

Wenn die Zeilenumbrüche tatsächlich im Körper aus den Saiten eingebettet sind, müssen Sie ersetzen ie name.replace("\n", " ")

+0

Danke! Als ich in meinem letzten Kommentar traurig war, versuchte ich eine weitere Lösung und fand heraus, dass es funktioniert hat. Ich bin mir immer noch nicht sicher über das Wie oder Warum von allem, aber ich lerne langsam. Danke noch einmal! – gsears

Verwandte Themen