পাইথন স্ট্রিং এ এইচটিএমএল সত্তা ডিকোড?


266

আমি বিউটিফুল স্যুপ 3 দিয়ে কিছু এইচটিএমএলকে পার্স করছি, তবে এতে এইচটিএমএল সত্তা রয়েছে যা সুন্দর স্যুপ 3 স্বয়ংক্রিয়ভাবে আমার জন্য ডিকোড করে না:

>>> from BeautifulSoup import BeautifulSoup

>>> soup = BeautifulSoup("<p>&pound;682m</p>")
>>> text = soup.find("p").string

>>> print text
&pound;682m

পরিবর্তে textপেতে কীভাবে আমি এইচটিএমএল সত্তাকে ডিকোড করতে পারি ।"£682m""&pound;682m"


উত্তর:


521

পাইথন ৩.৪++

ব্যবহার html.unescape():

import html
print(html.unescape('&pound;682m'))

এফওয়াইআই হ্রাস html.parser.HTMLParser.unescapeকরা হয়েছে, এবং 3.5 সালে সরানোর কথা ছিল , যদিও এটি ভুল করে ফেলে রাখা হয়েছিল। এটি শীঘ্রই ভাষা থেকে সরানো হবে।


পাইথন ২.6-৩.৩

আপনি HTMLParser.unescape()স্ট্যান্ডার্ড লাইব্রেরি থেকে ব্যবহার করতে পারেন :

  • পাইথনের জন্য এটি ২.6-২.। রয়েছে HTMLParser
  • পাইথন 3 এর জন্য এটি রয়েছে html.parser
>>> try:
...     # Python 2.6-2.7 
...     from HTMLParser import HTMLParser
... except ImportError:
...     # Python 3
...     from html.parser import HTMLParser
... 
>>> h = HTMLParser()
>>> print(h.unescape('&pound;682m'))
£682m

আপনি sixআমদানিটি সহজ করার জন্য সামঞ্জস্য লাইব্রেরি ব্যবহার করতে পারেন :

>>> from six.moves.html_parser import HTMLParser
>>> h = HTMLParser()
>>> print(h.unescape('&pound;682m'))
£682m

9
এই পদ্ধতিতে "& # 8217" এর মতো অক্ষরগুলি থেকে যায় বলে মনে হয় না; গুগল অ্যাপ ইঞ্জিনে, যদিও এটি পাইথন ২..6 এ স্থানীয়ভাবে কাজ করে। এটি এখনও সত্তাগুলি ডিকোড করে (যেমন & quot;) অন্তত
gfxmonk

কীভাবে একটি অনিবন্ধিত এপিআই হ্রাস করা যায়? উত্তরটি সম্পাদনা করেছেন।
মার্কাস আনটারওয়াদিজিটর

পছন্দ করেছেন এইটি হ্রাস করার সতর্কতা ছুড়ে দেয় - উত্তরে আমার সম্পাদনা দেখুন।
মার্ক আমেরিকা

এটি আরও যুক্তিযুক্ত বলে মনে হবে যে, কেবলমাত্র unescapeপদ্ধতির চেয়ে পুরো HTMLParserমডিউলটিকে অনুকূলে ফেলে দেওয়া হয়েছিল html.parser
টম রাসেল

পাইথন 2-র জন্য মূল্যবান লক্ষণীয়: বিশেষ অক্ষরগুলি তাদের ল্যাটিন -1 (আইএসও -8859-1) এনকোডিং অংশগুলির সাথে প্রতিস্থাপন করা হয়েছে। যেমন, এটি প্রয়োজন হতে পারে h.unescape(s).encode("utf-8")। দস্তাবেজ: "" "এখানে প্রদত্ত সংজ্ঞাটিতে XHTML 1.0 দ্বারা সংজ্ঞায়িত সমস্ত সত্তা রয়েছে যা লাতিন -1 অক্ষর সেট (আইএসও -8859-1) এর সাধারণ পাঠ্য প্রতিস্থাপন ব্যবহার করে পরিচালনা করা যেতে পারে" ""
বেনামে কাপুরুষতা

65

সুন্দর স্যুপ সত্তা রূপান্তর পরিচালনা করে। বিউটিফুল স্যুপ 3-এ আপনাকে কনস্ট্রাক্টরের convertEntitiesকাছে আর্গুমেন্ট নির্দিষ্ট করতে হবে BeautifulSoup( আর্কাইভড ডক্সের 'সত্তা রূপান্তর' বিভাগটি দেখুন)। বিউটিফুল স্যুপ 4 এ সত্তা স্বয়ংক্রিয়ভাবে ডিকোড হয়ে যায়।

সুন্দর স্যুপ 3

>>> from BeautifulSoup import BeautifulSoup
>>> BeautifulSoup("<p>&pound;682m</p>", 
...               convertEntities=BeautifulSoup.HTML_ENTITIES)
<p682m</p>

সুন্দর স্যুপ 4

>>> from bs4 import BeautifulSoup
>>> BeautifulSoup("<p>&pound;682m</p>")
<html><body><p682m</p></body></html>

+1 টি। দস্তাবেজে কীভাবে আমি এটি মিস করেছি সে সম্পর্কে কোনও ধারণা নেই: তথ্যের জন্য ধন্যবাদ। আমি লুচের উত্তরটি গ্রহণ করতে যাচ্ছি কারণ তাঁর প্রশ্নে আমি যে স্ট্যান্ডার্ড লিবটি নির্দিষ্ট করেছি (যা আমার কাছে গুরুত্বপূর্ণ নয়) এবং এটি সম্ভবত অন্যান্য লোকদের আরও সাধারণ ব্যবহারের কারণ হিসাবে ব্যবহার করবে।
jkp

5
BeautifulSoup4HTMLParserবেশিরভাগ ব্যবহার করে । উত্সটি
scharfmn

4
আসল স্ট্রিংয়ের অংশ না ছিল এমন সমস্ত এক্সটারনেস এইচটিএমএল ছাড়া আমরা কীভাবে সুন্দর স্যুপ 4 এ রূপান্তর পেতে পারি? (অর্থাত্ <html> এবং <body>)
প্রেক্সাইটেলস

@Praxiteles: BeautifulSoup ( '& পাউন্ড; 682m', "html.parser") stackoverflow.com/a/14822344/4376342
Soitje

13

আপনি w3lib.html লাইব্রেরি থেকে রিপ্লেস_এনটিটি ব্যবহার করতে পারেন

In [202]: from w3lib.html import replace_entities

In [203]: replace_entities("&pound;682m")
Out[203]: u'\xa3682m'

In [204]: print replace_entities("&pound;682m")
£682m

2

সুন্দর স্যুপ 4 আপনাকে আউটপুটে একটি ফর্ম্যাটর সেট করতে দেয়

আপনি যদি পাস করেন তবে formatter=Noneবিউটিফুল স্যুপ আউটপুটটিতে স্ট্রিংগুলিতে কোনও পরিবর্তন করবে না। এটি দ্রুততম বিকল্প, তবে এটি উদাহরণস হিসাবে যেমন সুন্দর স্যুপটি অবৈধ এইচটিএমএল / এক্সএমএল উত্পন্ন করতে পারে:

print(soup.prettify(formatter=None))
# <html>
#  <body>
#   <p>
#    Il a dit <<Sacré bleu!>>
#   </p>
#  </body>
# </html>

link_soup = BeautifulSoup('<a href="http://example.com/?foo=val1&bar=val2">A link</a>')
print(link_soup.a.encode(formatter=None))
# <a href="http://example.com/?foo=val1&bar=val2">A link</a>

এটি প্রশ্নের উত্তর দেয় না। (এছাড়াও, ডক্সগুলি কী বলছে তা এখানে HTML এর চূড়ান্ত বিট সম্পর্কে অবৈধ বলে আমার কোনও ধারণা নেই))
মার্ক অ্যামেরি

<< সত্যিকারের ব্লু! >> এটি অবৈধ </> এবং এটি চারপাশের এইচটিএমএলকে ভেঙে দেবে বলে এটি অবৈধ অংশ। আমি জানি এটি আমার কাছ থেকে একটি দেরী পোস্ট, তবে যদি কেউ এমন হতে দেখে এবং অবাক হয় ...
GMasucci

0

আমার অনুরূপ এনকোডিংয়ের সমস্যা ছিল। আমি নরমালাইজ () পদ্ধতিটি ব্যবহার করেছি। অন্য ডিরেক্টরিতে .html ফাইলটিতে আমার ডেটা ফ্রেম রফতান করার সময় আমি প্যানডাস .to_html () পদ্ধতিটি ব্যবহার করে একটি ইউনিকোড ত্রুটি পেয়েছিলাম। আমি এই কাজটি শেষ করেছি এবং এটি কাজ করেছে ...

    import unicodedata 

ডেটাফ্রেম অবজেক্টটি আপনার যা পছন্দ তা হতে পারে, আসুন একে টেবিল বলি ...

    table = pd.DataFrame(data,columns=['Name','Team','OVR / POT'])
    table.index+= 1

টেবিলের ডেটা এনকোড করুন যাতে আমরা এটি টেমপ্লেট ফোল্ডারে .html ফাইলের বাইরে রফতানি করতে পারি (এটি আপনার ইচ্ছা যেখানেই অবস্থান হতে পারে :))

     #this is where the magic happens
     html_data=unicodedata.normalize('NFKD',table.to_html()).encode('ascii','ignore')

এইচটিএমএল ফাইলে স্বাভাবিক স্ট্রিং রফতানি করুন

    file = open("templates/home.html","w") 

    file.write(html_data) 

    file.close() 

তথ্যসূত্র: ইউনিকোডেটা ডকুমেন্টেশন


-4

এটি সম্ভবত এখানে প্রাসঙ্গিক নয়। তবে একটি সম্পূর্ণ ডকুমেন্ট থেকে এই এইচটিএমএল এন্টিটগুলি অপসারণ করতে, আপনি এর মতো কিছু করতে পারেন: (ডকুমেন্ট = পৃষ্ঠাটি ধরে নিন এবং দয়া করে মলা কোডটি ক্ষমা করুন, তবে কীভাবে এটি আরও ভাল করা যায় সে সম্পর্কে আপনার যদি ধারণা থাকে তবে আমি সমস্ত কান - আমি নতুন এই).

import re
import HTMLParser

regexp = "&.+?;" 
list_of_html = re.findall(regexp, page) #finds all html entites in page
for e in list_of_html:
    h = HTMLParser.HTMLParser()
    unescaped = h.unescape(e) #finds the unescaped value of the html entity
    page = page.replace(e, unescaped) #replaces html entity with unescaped value

7
না! আপনাকে নিজেরাই এইচটিএমএল সত্তার সাথে মেলে ধরতে হবে না এবং এগুলি লুপ করতে হবে না; .unescape()এটা তোমার জন্য করে । আমি বুঝতে পারি না কেন আপনি এবং রব এই অতি-জটিল জটিল সমাধানগুলি পোস্ট করেছেন যা তাদের নিজস্ব সত্তার সাথে মিলে যায় যখন গ্রহণযোগ্য উত্তরটি ইতিমধ্যে পরিষ্কারভাবে দেখায় যে .unescape()স্ট্রিংটিতে সত্তা সন্ধান করতে পারে।
মার্ক আমেরিকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.