2017-02-02 3 views
-3

Как вы не можете добавлять символы пробела при вызове str()? У меня есть скребок экрана/веб-искатель, который использует urllib.request. Я вызываю str() в своем контенте. Вот код, который у меня есть.Метод str() добавляет пробельные символы

req = urllib.request.Request(national_url, headers={'User-Agent' : "Magic Browser"}) 
con = urllib.request.urlopen(req) 

#grab html 
html = con.read() 
my_str = str(html) 

проблемы я использовать регулярное выражение для разбора этого HTML для некоторых моделей, и ул добавляет все пробельные символы, такие как \ п и \ т.

Мой вопрос в том, как предотвратить функцию str() от добавления этих дополнительных символов символов.

EDIT

Я использовал urllib2 раньше в Python 2.7 сценарий я написал. Я перевел его на новый компьютер, но начал использовать python 3.6 на этом компьютере. Эти регулярные выражения больше не работали. Я получал ошибку, когда передал con.read() этой функции. Я завернул con.read() в вызове str(), как показано выше, и я заметил в 3.6, когда функция con.read() добавила целую кучу \ t и n. Мой вопрос заключается в том, как я могу заставить мои выражения работать или запрещать все «символы символов charator», иначе известные как «\ t \ n» (я буду признавать, что, вероятно, я использую неправильный термин для этих символов).

Это работало в Python 2.7. Я переключился на python 3.6.

def parse_html_doc(str='', poke_id = 0): 
    if len(str) > 0: 

     poke = MyClass() 
     poke.dex_num = re.search('\d+(?=<\/strong>)', str).group(0) 
     poke.name = re.search('[A-Za-z]+(?=<\/h1>)', str).group(0) 
     poke.hp = re.search('\d+', re.search('<th>HP<\/th>\s+<td class="num">\d+<\/td>', str).group(0)).group(0) 
     poke.atk = re.search('\d+', re.search('<th>Attack<\/th>\s+<td class="num">\d+<\/td>', str).group(0)).group(0) 
     poke.bdef = re.search('\d+', re.search('<th>Defense<\/th>\s+<td class="num">\d+<\/td>', str).group(0)).group(0) 
     poke.spatk = re.search('\d+', re.search('<th>Sp\. Atk<\/th>\s+<td class="num">\d+<\/td>', str).group(0)).group(0) 
     poke.spatk = re.search('\d+', re.search('<th>Sp\. Def<\/th>\s+<td class="num">\d+<\/td>', str).group(0)).group(0) 
     poke.spd = re.search('\d+', re.search('<th>Speed<\/th>\s+<td class="num">\d+<\/td>', str).group(0)).group(0) 
     poke.des = re.search('<p>.*<\/p>', str).group(0).replace('"', '""') 
     poke.id = poke_id 
     return poke 
+1

Уточнитните «Добавление этих дополнительных литералов характера». Вы имеете в виду, что их там нет, пока вы не назовете str, а затем они появятся после? Или вы имеете в виду, что вам не нравится, как они отображаются? Можете ли вы привести пример использования? – SethMMorton

+2

«str добавляет все пробельные символы, такие как \ n и \ t" - нет, это не так. «проблема в том, что я использую regex для анализа этого html для некоторых шаблонов» - да, это, безусловно, проблема. Не используйте регулярные выражения для анализа HTML. Используйте настоящий парсер, например BeautifulSoup. – user2357112

+1

'str()' не добавляет эти символы - они существуют все время - и поэтому мы используем синтаксические анализаторы, такие как 'lxml' или' BeautifulSoup'. – furas

ответ

0

Похоже, что вы хотите сделать это:

eq = urllib.request.Request(national_url, headers={'User-Agent' : "Magic Browser"}) 
con = urllib.request.urlopen(req) 

#grab html 
html = con.read() 
my_str = str(html.replace("\n", "") 
my_str = my_str.replace("\t", "") 

Это должно устранить все пробельные символы из вашей строки.

+0

Это не сработало для меня, так как maketrans не существует в строковом модуле. – ddeamaral

+1

кажется, что я ошибался. 'string.maketrans' устарел. Я обновлю ответ. – Steampunkery

+0

По-прежнему возникает ошибка. my_str = str (html.translate (str.maketrans ("\ n \ t \ r", ""))) ValueError: первые два аргумента maketrans должны иметь равную длину – ddeamaral

1

str() не создает этих символов, они уже были там.

Если вы хотите удалить \n и whitespace в начале и в конце строки, то вы можете просто использовать

s = '\n  bla 123\n 1235\n ...\n' 
result = s.strip() 
print(result) 

> 'bla 123\n 1235\n ...' 
Смежные вопросы