2016-08-30 2 views
1

У меня возникли проблемы с тем, что кажется скрытым символом новой строки в строках, полученных с помощью функции BeautifulSoup .find. Код, который я просматриваю html-документ, вытаскивает имя, название, компанию и страну как строки. Я печатаю флажок и вижу, что они были строками, и когда я печатаю их и проверяю их длину, все выглядит как обычные строки. Но когда я использую их либо в print("%s is a %s at %s in %s" % (name,title,company,country)), либо outputWriter.writerow([name,title,company,country]) для записи в файл csv, я получаю дополнительные строки, которые, похоже, не присутствуют в строках.BeautifulSoup добавляет нежелательные строки к строкам Python3.5

Что происходит? Или кто-нибудь может указать мне в правильном направлении?

Я новичок в Python и не знаю, где искать все, что я не знаю, поэтому я прошу здесь, проведя весь день, пытаясь исправить проблему. Я искал через google и несколько других статей переполнения стека при удалении скрытых символов, но ничего не работает.

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

Я решил проблему, попробовав еще один фильтр. def filter_non_printable (str): return '' .join ([c для c в str, если ord (c)> 31 или ord (c) == 9]) – gsears

ответ

0

Скорее всего, вам нужно полосы пробельные, нет ничего в вашем коде, который добавляет поэтому он должен быть там:

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

Вы можете проверить, что нас там видя магнезии outpout:

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

При печати лет у см ул выход, так что если есть символ новой строки, вы не можете понять это есть:

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

Если перевод строки фактически встроены в тело от строк, вы должны замените, т. е. name.replace("\n", " ")

+0

Спасибо! Как я сожалел в своем последнем комментарии, я попробовал еще одно решение и обнаружил, что он сработал. Я до сих пор не уверен в том, что у нас есть или все, но я медленно учусь. Еще раз спасибо! – gsears

Смежные вопросы