পাইথন: স্ট্রিং থেকে a xa0 সরানো হচ্ছে?


241

আমি বর্তমানে একটি HTML ফাইল get_text()পার্সিং এবং কল করার জন্য বিউটিফুল স্যুপ ব্যবহার করছি , তবে মনে হচ্ছে আমার অনেকগুলি a xa0 ইউনিকোড ফাঁকা স্থান উপস্থাপন করে রেখে চলেছে। পাইথন ২.7-এ সমস্ত মুছে ফেলার এবং এগুলিকে স্পেসে পরিণত করার কোনও কার্যকর উপায় আছে কি? আমি অনুমান করি যে আরও সাধারণ প্রশ্নটি হবে, ইউনিকোড বিন্যাস অপসারণের কোনও উপায় আছে কি?

আমি ব্যবহার করার চেষ্টা করেছি: line = line.replace(u'\xa0',' ')যেমনটি অন্য থ্রেডের পরামর্শ অনুসারে, তবে এটি a xa0 এরটিকে u এর মধ্যে পরিবর্তিত করেছে, সুতরাং এখন আমি তার পরিবর্তে সর্বত্র "ইউ" রেখেছি। ):

সম্পাদনা: সমস্যাটি সমাধান হয়ে গেছে বলে মনে হচ্ছে str.replace(u'\xa0', ' ').encode('utf-8'), তবে কেবল না .encode('utf-8')করেই এটি replace()অযৌক্তিক চরিত্রগুলিও ছড়িয়ে দেয় বলে মনে হচ্ছে, উদাহরণস্বরূপ xc2। কেউ কি এই ব্যাখ্যা করতে পারেন?


ইতিমধ্যে চেষ্টা করেছেন যে, 'এসকিআই' কোডেক 0xa0 পজিশনে 0 ডেক্সড করতে পারবেন না 0: অর্ডিনাল রেঞ্জ নয় (128)
zhuyxn

15
ইউনিকোড আলিঙ্গন। u''S এর পরিবর্তে s ব্যবহার করুন ''। :-)
jpaugh

1
স্ট্রিংরেপ্লেস (u '\ xa0', '') ব্যবহার করার চেষ্টা করেছেন তবে u xa0s এর পরিবর্তে সর্বত্র "আপনি" পেয়েছেন: /
zhuyxn

যদি স্ট্রিংটি ইউনিকোড হয় তবে আপনাকে u' 'প্রতিস্থাপনটি ব্যবহার করতে হবে, এটির নয় ' '। মূল স্ট্রিংটি কি ইউনিকোড এক?
পিআরপি

উত্তর:


266

a xa0 আসলে ল্যাটিন 1 (আইএসও 8859-1), ক্রিয়াকলাপ (160) এ অবিচ্ছেদী স্থান। আপনার এটি একটি স্থান দিয়ে প্রতিস্থাপন করা উচিত।

string = string.replace(u'\xa0', u' ')

যখন .encode ('utf-8'), এটি ইউনিকোডটিকে utf-8 এ এনকোড করবে, তার মানে প্রতিটি ইউনিকোডকে 1 থেকে 4 বাইট উপস্থাপন করা যেতে পারে। এই ক্ষেত্রে, by xa0 2 বাইট \ xc2 \ xa0 দ্বারা প্রতিনিধিত্ব করা হয়।

Http://docs.python.org/howto/unicode.html এ পড়ুন ।

দয়া করে নোট করুন: ২০১২ সাল থেকে এই উত্তরটি পাইথন এগিয়ে গেছে, আপনি unicodedata.normalizeএখন ব্যবহার করতে সক্ষম হবেন


11
ইউনিকোড এবং চরিত্রের এনকোডিংগুলি সম্পর্কে আমি বিপুল পরিমাণে জানি না .. তবে মনে হচ্ছে ইউনিকোডেটা.অনর্মালাইজ করা স্ট্রাইর রিপ্লেসের চেয়ে বেশি উপযুক্ত হবে
dbr

আপনার স্ট্রিংগুলির জন্য কার্যকর পরামর্শ, তবে নোট করুন যে এই স্ট্রিংয়ের সমস্ত উল্লেখগুলিও প্রতিস্থাপন করা দরকার। উদাহরণস্বরূপ, যদি আপনার কাছে এমন কোনও প্রোগ্রাম থাকে যা ফাইলগুলি খোলায় এবং ফাইলগুলির মধ্যে একটির নামে নন-ব্রেকিং স্পেস থাকে তবে আপনাকে এই প্রতিস্থাপনটি করার পাশাপাশি সেই ফাইলটির নতুন নামকরণ করতে হবে ।
g33kz0r

1
ইউ + 00a0 একটি নন-ব্রেকএল স্পেস ইউনিকোড অক্ষর যা ল্যাটিন 1 এনকোডিংয়ে b'\xa0'বাইট হিসাবে b'\xc2\xa0'ইউএফএফ -8 এনকোডিংয়ে দুটি বাইট হিসাবে এনকোড করা যায়। এটি  এইচটিএমএল হিসাবে প্রতিনিধিত্ব করা যেতে পারে ।
jfs 20'15

3
আমি এটি চেষ্টা করার পরে, আমি পেতে UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 397: ordinal not in range(128)
gwg

1 ঘন্টা ধরে আটকে ছিল এবং শেষ পর্যন্ত সমাধান হয়েছে। অনেক ধন্যবাদ.
সাদমান হাসান

217

পাইথনের unicodedataলাইব্রেরিতে অনেক দরকারী জিনিস রয়েছে । তার মধ্যে একটি হ'ল .normalize()ফাংশন।

চেষ্টা করুন:

new_str = unicodedata.normalize("NFKD", unicode_str)

উপরের লিঙ্কে তালিকাভুক্ত অন্য যে কোনও পদ্ধতির সাথে এনএফকেডি প্রতিস্থাপন করা যদি আপনি পরে ফলাফল না পান তবে।


9
এটা অসাধারণ. এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
Houman

2
সম্পূর্ণ একমত. সহজ, পরিষ্কার, সংক্ষিপ্ত এবং পয়েন্ট সমাধানের। থাম্বস আপ।
বিলি ঝন

2
এতটা নিশ্চিত না, আপনি normalize('NFKD', '1º\xa0dia')'1º দিয়া' ফিরতে চাইতে পারেন তবে এটি '1o
ডায়া


1
আহ, পাঠ্যটি যদি 'কোরিয়ান' হয় তবে এটি চেষ্টা করবেন না। 네요 가 전부 깨져 버리 네요।

18

আপনার লাইনের শেষে .strip () ব্যবহার করার চেষ্টা করুন line.strip()আমার জন্য ভাল কাজ করেছে


15

এটির সংক্ষিপ্তসার হিসাবে বেশ কয়েকটি পদ্ধতি ব্যবহার করার পরে আমি এটি এটি করেছি। পার্স করা এইচটিএমএল স্ট্রিং থেকে a xa0 টি অক্ষর এড়ানো / অপসারণের দুটি উপায় নীচে দেওয়া হয়েছে।

ধরে নিন আমাদের নীচে আমাদের কাঁচা এইচটিএমএল রয়েছে:

raw_html = '<p>Dear Parent, </p><p><span style="font-size: 1rem;">This is a test message, </span><span style="font-size: 1rem;">kindly ignore it. </span></p><p><span style="font-size: 1rem;">Thanks</span></p>'

সুতরাং এই এইচটিএমএল স্ট্রিংটি পরিষ্কার করার চেষ্টা করা যাক:

from bs4 import BeautifulSoup
raw_html = '<p>Dear Parent, </p><p><span style="font-size: 1rem;">This is a test message, </span><span style="font-size: 1rem;">kindly ignore it. </span></p><p><span style="font-size: 1rem;">Thanks</span></p>'
text_string = BeautifulSoup(raw_html, "lxml").text
print text_string
#u'Dear Parent,\xa0This is a test message,\xa0kindly ignore it.\xa0Thanks'

উপরের কোডটি স্ট্রিংয়ে এই অক্ষরগুলি তৈরি করে produces xa0 । এগুলি সঠিকভাবে সরানোর জন্য, আমরা দুটি উপায় ব্যবহার করতে পারি।

পদ্ধতি # 1 (প্রস্তাবিত): প্রথমটি হ'ল বিউটিফুলসুপের get_text পদ্ধতিটি স্ট্রিপ আর্গুমেন্ট সহ সত্য হিসাবে আমাদের কোড হয়ে যায়:

clean_text = BeautifulSoup(raw_html, "lxml").get_text(strip=True)
print clean_text
# Dear Parent,This is a test message,kindly ignore it.Thanks

পদ্ধতি # 2: অন্য বিকল্পটি পাইথনের লাইব্রেরি ইউনিকোডেটা ব্যবহার করা

import unicodedata
text_string = BeautifulSoup(raw_html, "lxml").text
clean_text = unicodedata.normalize("NFKD",text_string)
print clean_text
# u'Dear Parent,This is a test message,kindly ignore it.Thanks'

আমি এই ব্লগে এই পদ্ধতিগুলি বিস্তারিতভাবে বর্ণনা করেছি যা আপনি উল্লেখ করতে চাইতে পারেন।


আপনাকে ধন্যবাদ, পদ্ধতি 1 আমি যা পরে দেখছিলাম।
ভাসিম

12

এটা চেষ্টা কর:

string.replace('\\xa0', ' ')

5
@ রায়ানমার্টিন: এটি চারটি বাইটের পরিবর্তে : len(b'\\xa0') == 4কিন্তু len(b'\xa0') == 1। যদি সম্ভব হয়; আপনার প্রবাহকে ঠিক করা উচিত যা এই পলায়নগুলি উত্পন্ন করে।
jfs 20'15

12

পাইথনের সাথে স্কাইলাইট 3 ডাটাবেস থেকে কিছু তথ্য টানতে আমি এই একই সমস্যায় পড়েছি। উপরের উত্তরগুলি আমার পক্ষে কার্যকর হয়নি (কেন তা নিশ্চিত নয়) তবে এটি করেছে: line = line.decode('ascii', 'ignore')তবে, আমার লক্ষ্যটি ফাঁকা জায়গায় প্রতিস্থাপনের পরিবর্তে \ xa0 মুছছিল।

নেড ব্যাচেল্ডারের এই সুপার-সহায়ক ইউনিকোড টিউটোরিয়ালটি থেকে এটি পেয়েছি


14
আপনি এখন এমন কোনও কিছু সরিয়ে ফেলছেন যা ASCII চরিত্র নয়, আপনি সম্ভবত আপনার আসল সমস্যাটি মাস্ক করছেন। ব্যবহার 'ignore'শিফট লাঠি মাধ্যমে ঠেলাঠেলি যদিও আপনি বুঝতে পারছি না কিভাবে ছোঁ .. কাজ করে ভালো হয়
Martijn Pieters

@ মার্তিজ্নপিটারগুলি লিঙ্কযুক্ত ইউনিকোড টিউটোরিয়ালটি ভাল তবে আপনি সম্পূর্ণ সঠিক - str.encode(..., 'ignore')এটি ইউনিকোড-হ্যান্ডলিংয়ের সমতুল্য try: ... except: ...। যদিও এটি ত্রুটির বার্তাটি লুকিয়ে রাখতে পারে তবে সমস্যাটি খুব কমই সমাধান করে।
dbr

1
EMAIL বা .decode('ascii', 'ignore')
URLS এর

1
সামউইজের উত্তরটি আপনার পক্ষে কার্যকর হয়নি কারণ এটি ইউনিকোড স্ট্রিংয়ে কাজ করে । line.decode()আপনার উত্তরে পরামর্শ দেওয়া হয়েছে যে আপনার ইনপুটটি বাইস্টেরিং (আপনি .decode()কোনও ইউনিকোড স্ট্রিংয়ে কল করবেন না (এটি প্রয়োগ করতে, পদ্ধতিটি পাইথন 3 এ সরিয়ে দেওয়া হয়েছে)। আপনি যে টিউটোরিয়ালটি দেখতে পেলেন তা কীভাবে সম্ভব তা আমি বুঝতে পারি না) আপনার উত্তর লিঙ্ক এবং বাইট এবং ইউনিকোড (তাদের মিশ্রিত করা না) মধ্যে পার্থক্য মিস করি।
JFS

8

মুদ্রণযোগ্য অক্ষর নয় এমন সমস্যা নিয়ে গুগল করার সময় আমি এখানেই শেষ। আমি মাইএসকিউএল UTF-8 general_ciএবং পোলিশ ভাষা ব্যবহার করি । সমস্যাযুক্ত স্ট্রিংয়ের জন্য আমাকে নিম্নরূপ সংগ্রহ করতে হবে:

text=text.replace('\xc2\xa0', ' ')

এটি কেবল দ্রুত কাজ করা এবং আপনার সম্ভবত ডান এনকোডিং সেটআপ সহ কিছু চেষ্টা করা উচিত।


1
এটি কাজ করে যদি textএকটি বাইস্টেরিং হয় যা utf-8 ব্যবহার করে এনকোডড একটি পাঠ্যকে উপস্থাপন করে। আপনি যদি পাঠ্য নিয়ে কাজ করছেন; এটিকে প্রথমে ইউনিকোডে ডিকোড করুন এবং একে একে একে একে একে একে একে একে একে .decode('utf-8')একে শেষ পর্যন্ত শেষ করতে হবে (যদি API ইউনিকোডকে সরাসরি সমর্থন করে না, যেমন socket)। পাঠ্যের সমস্ত মধ্যবর্তী ক্রিয়াকলাপ ইউনিকোডে করা উচিত।
jfs

8

এই কোড ব্যবহার করে দেখুন

import re
re.sub(r'[^\x00-\x7F]+','','paste your string here').decode('utf-8','ignore').strip()

4

ইউটিএফ -8 এ 0xA0 (ইউনিকোড) 0xC2A0। .encode('utf8')কেবল আপনার ইউনিকোড 0xA0 নেবে এবং ইউটিএফ -8 এর 0xC2A0 এর সাথে প্রতিস্থাপন করবে। সুতরাং 0xC2s এর সংযোজন ... এনকোডিং প্রতিস্থাপন করছে না, আপনি সম্ভবত এখন বুঝতে পেরেছেন।


1
0xc2a0অস্পষ্ট (বাইট অর্ডার)। b'\xc2\xa0'পরিবর্তে আক্ষরিক বাইট ব্যবহার করুন ।
jfs

3

এটি কোনও স্থানের অক্ষরের সমতুল্য, তাই এটি সজ্জিত করুন

print(string.strip()) # no more xa0

1

বিউটিফুল স্যুপে, আপনি get_text()স্ট্রিপ পরামিতিটি পাস করতে পারেন , যা পাঠ্যের শুরু এবং শেষ থেকে সাদা স্থানকে সরিয়ে দেয়। এটি \xa0স্ট্রিংয়ের শুরু বা শেষের দিকে দেখা দিলে এটি অপসারণ বা অন্য কোনও সাদা স্থান মুছে ফেলবে । সুন্দর স্যুপ একটি খালি স্ট্রিং প্রতিস্থাপন করেছে \xa0এবং এটি আমার জন্য সমস্যার সমাধান করেছে।

mytext = soup.get_text(strip=True)

5
strip=True&nbsp;পাঠ্যের প্রতিটি বিটের শুরুতে বা শেষে থাকলে কেবলমাত্র কাজ করে । পাঠ্যের অন্যান্য অক্ষরের অভ্যন্তরে থাকলে স্থানটি সরিয়ে ফেলবে না।
jfs

1

নিয়মিত প্রকাশের সাথে জেনেরিক সংস্করণ (এটি সমস্ত নিয়ন্ত্রণের অক্ষর সরিয়ে ফেলবে):

import re
def remove_control_chart(s):
    return re.sub(r'\\x..', '', s)

-1

পাইথন এটিকে স্পেস ক্যারেক্টারের মতো চিনে, তাই আপনি splitএটি আরগস ছাড়াই করতে পারেন এবং একটি সাধারণ সাদা স্থানের সাথে যোগ দিতে পারেন :

line = ' '.join(line.split())
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.