পাইথন ব্যবহার করে এইচটিএমএল পার্স করা হচ্ছে


185

আমি পাইথনের জন্য এইচটিএমএল পার্সার মডিউলটি সন্ধান করছি যা পাইথন তালিকাগুলি / অভিধান / অবজেক্টের আকারে ট্যাগ পেতে আমাকে সহায়তা করতে পারে।

আমার কাছে যদি ফর্মটির একটি নথি থাকে:

<html>
<head>Heading</head>
<body attr1='val1'>
    <div class='container'>
        <div id='class'>Something here</div>
        <div>Something else</div>
    </div>
</body>
</html>

তারপর এটা আমার নাম বা HTML ট্যাগের আইডি মাধ্যমে নেস্টেড ট্যাগ অ্যাক্সেস করতে যাতে আমি মূলত এটা জিজ্ঞাসা আমাকে সামগ্রী / টেক্সট পেতে পারেন একটি উপায় দিতে হবে divসঙ্গে ট্যাগ class='container'মধ্যে অন্তর্ভুক্ত bodyট্যাগ, বা অনুরূপ কিছু।

আপনি যদি ফায়ারফক্সের "পরিদর্শন উপাদান" বৈশিষ্ট্যটি (HTML দেখুন) ব্যবহার করেছেন তবে আপনি জানতে পারবেন এটি আপনাকে গাছের মতো সুন্দর নেস্টেড পদ্ধতিতে সমস্ত ট্যাগ দেয়।

আমি একটি অন্তর্নির্মিত মডিউল পছন্দ করি তবে এটি হয়ত খুব বেশি জিজ্ঞাসা করবে।


আমি স্ট্যাক ওভারফ্লো এবং ইন্টারনেটে কয়েকটি ব্লগ নিয়ে প্রচুর প্রশ্ন দিয়েছি এবং তাদের মধ্যে বেশিরভাগই বিউটিফুলসপ বা এলএক্সএমএল বা এইচটিএমএল পার্সারের পরামর্শ দিচ্ছেন তবে এর কয়েকটি কার্যকারিতা এবং এটিকে বিতর্ক হিসাবে শেষ করা হয়েছে কোনটি দ্রুত / আরও কার্যকর ent


2
অন্যান্য উত্তরদাতাদের মতো আমিও বিউটিফুলসপ প্রস্তাব দিই কারণ ভাঙা এইচটিএমএল ফাইলগুলি পরিচালনা করতে এটি সত্যিই ভাল।
পাস্কেল রোসিন

উত্তর:


195

যাতে আমি এটি ডিভি ট্যাগের লিখিত সামগ্রী / পাঠ্যটি বডি ট্যাগের মধ্যে থাকা ক্লাস = 'ধারক' সহ, বা অনুরূপ কিছু পাওয়ার জন্য বলতে পারি।

try: 
    from BeautifulSoup import BeautifulSoup
except ImportError:
    from bs4 import BeautifulSoup
html = #the HTML code you've written above
parsed_html = BeautifulSoup(html)
print(parsed_html.body.find('div', attrs={'class':'container'}).text)

আমার ধারণা অনুমান করা আপনার পারফরম্যান্সের বিবরণ দরকার নেই - শুধু কীভাবে বিউটিফুলসপ কাজ করে তা পড়ুন। এর অফিসিয়াল ডকুমেন্টেশন দেখুন


2
পার্সড_এইচটিএমএল অবজেক্টটি ঠিক কী?
flledgling

1
"পার্সেড_এইচটিএমএল" একটি বিউটিফুলসুপ অবজেক্ট, এটি একটি ডোমলেট বা ডোমডোকামেন্টের মতো মনে করুন, "কৃপণ" বৈশিষ্ট্য ব্যতীত, "বডি" হ'ল বিউটিউসসপ অবজেক্টটি উল্লেখ করবে (মনে রাখবেন, এটি মূলত একটি ট্রি নোড) প্রথমটির (এবং এই ক্ষেত্রে , শুধুমাত্র) মূল উপাদানটির দেহ উপাদান (আমাদের ক্ষেত্রে, এইচটিএমএল)
আডাম

18
মাত্র একটি আপডেট: বিউটিফুলসপ 4 হিসাবে, আমদানি লাইনটি এখনfrom bs4 import BeautifulSoup
বেইলি পার্কার 6

2
সাধারণ তথ্য: কর্মক্ষমতা সমালোচনামূলক হলে এর lxmlপরিবর্তে লাইব্রেরিটি আরও ভালভাবে ব্যবহার করুন (নীচের উত্তর দেখুন)। সঙ্গে cssselectএটা বেশ দরকারী aswell এবং কর্মক্ষমতা প্রায়ই 10- হয় প্রাপ্তিসাধ্য অন্যান্য লাইব্রেরি বেশী ভালো 100 ভাঁজ।
লেনার হোয়েট

দ্রষ্টব্য: classবৈশিষ্ট্যটি বিশেষ:BeautifulSoup(html).find('div', 'container').text
jfs

85

আমার ধারণা আপনি কী খুঁজছেন তা পাইকুরি :

পাইকোয়ারি: পাইথুনের জন্য একটি জেকুরি লাইব্রেরি।

আপনি যা চান তার একটি উদাহরণ হতে পারে:

from pyquery import PyQuery    
html = # Your HTML CODE
pq = PyQuery(html)
tag = pq('div#id') # or     tag = pq('div.class')
print tag.text()

এবং এটি ফায়ারফক্স বা ক্রোমের পরিদর্শন উপাদান হিসাবে একই নির্বাচক ব্যবহার করে। উদাহরণ স্বরূপ:

এলিমেন্ট সিলেক্টরটি হ'ল ডিভ # মেগাওয়াট-হেড.নোপ্রিন্ট '

পরিদর্শন করা উপাদান নির্বাচক হলেন 'ডিভ # এমডাব্লু-হেড.নোপ্রিন্ট'। পাইকুরিতে আপনাকে কেবল এই নির্বাচককে পাস করতে হবে:

pq('div#mw-head.noprint')

2
এর জন্য আমি তোমাকে 3000 ভালবাসি!
প্রগতিমার

41

এখানে আপনি পাইথনের বিভিন্ন HTML পার্সার এবং তাদের কর্মক্ষমতা সম্পর্কে আরও পড়তে পারেন। নিবন্ধটি কিছুটা তারিখযুক্ত হওয়া সত্ত্বেও এটি আপনাকে একটি ভাল ওভারভিউ দেয়।

পাইথন এইচটিএমএল পার্সারের কর্মক্ষমতা

যদিও আমি এটি বিল্ট না করা সত্ত্বেও বিউটিফুলসপকে সুপারিশ করব Just কারণ এই ধরণের কাজের জন্য এটি কাজ করা এত সহজ। উদাহরণ:

import urllib2
from BeautifulSoup import BeautifulSoup

page = urllib2.urlopen('http://www.google.com/')
soup = BeautifulSoup(page)

x = soup.body.find('div', attrs={'class' : 'container'}).text

2
আমি এমন কিছু সন্ধান করছিলাম যা পারফরম্যান্স / দক্ষতার চেয়ে বৈশিষ্ট্য / কার্যকারিতা বিশদ দেয়। সম্পাদনা: প্রাক-পরিপক্ক উত্তরের জন্য দুঃখিত, লিঙ্কটি আসলে ভাল। ধন্যবাদ।
ffledgling

প্রথম পয়েন্ট-তালিকার ধরণের বৈশিষ্ট্যগুলি এবং ফাংশনগুলি সংক্ষেপে :)
কিয়াউ

5
আপনি যদি from bs4 import BeautifulSoup
বিউটিউসসপুপি 4

29

অন্যান্য পার্সার লাইব্রেরির তুলনায় lxmlঅত্যন্ত দ্রুত:

এবং cssselectএটির সাথে HTML পৃষ্ঠাগুলিও স্ক্র্যাপিংয়ের জন্য ব্যবহার করা বেশ সহজ:

from lxml.html import parse
doc = parse('http://www.google.com').getroot()
for div in doc.cssselect('a'):
    print '%s: %s' % (div.text_content(), div.get('href'))

lxML.html ডকুমেন্টেশন


এইচটিটিপিএস সমর্থিত নয়
সেরজিও

@ সার্জিও ব্যবহার করুন import requests, ফাইল বাফার সংরক্ষণ করুন: stackoverflow.com/a/14114741/1518921 (বা urllib), পার্স ব্যবহার করে লোড সেভ করা ফাইলের পরে,doc = parse('localfile.html').getroot()
গিলহার্ম ন্যাসিমেণ্টো

আমি একটি নির্দিষ্ট ডেটা জন্য বিশাল এইচটিএমএল পার্স। বিউটিফুলসুপ দিয়ে এটি করা 1.7সেকেন্ড সময় নিয়েছে , তবে পরিবর্তে lxML প্রয়োগ করে প্রায় দ্রুত গতি বাড়িয়েছে *100! যদি পারফরম্যান্স সম্পর্কে যত্নশীল হন তবে lxML হ'ল সেরা বিকল্প
অ্যালেক্স-বোগদানভ

9

আমি এইচটিএমএল পার্স করার জন্য lxML এর প্রস্তাব দিই । দেখুন "নির্ধারণ html" (lxml সাইটে)।

আমার অভিজ্ঞতায় বিউটিফুল স্যুপ কিছু জটিল এইচটিএমএল এ মিশে যায়। আমি বিশ্বাস করি যে কারণ সুন্দরী স্যুপ পার্সার নয়, বরং খুব ভাল স্ট্রিং বিশ্লেষক।


3
এআইইউআই বিউটিফুল স্যুপকে বেশিরভাগ "ব্যাকএন্ড" এক্সএমএল পার্সারগুলির সাথে কাজ করা যায়, এলএক্সএমএল সমর্থিত পার্সারগুলির মধ্যে একটি বলে মনে হয় crummy.com/software/BeLiveSoup/bs4/doc/#installing-a-parser
ffledgling

@ফ্লেডগলিং বিউটিফুলসুপের কিছু ফাংশন যদিও যথেষ্ট আলগা।
লেনার হোয়েট

2

আমি ন্যায়সঙ্গত লাইব্রেরি ব্যবহার করার পরামর্শ দিচ্ছি :

https://github.com/miso-belica/jusText

ব্যবহার: পাইথন 2:

import requests
import justext

response = requests.get("http://planet.python.org/")
paragraphs = justext.justext(response.content, justext.get_stoplist("English"))
for paragraph in paragraphs:
    print paragraph.text

Python3:

import requests
import justext

response = requests.get("http://bbc.com/")
paragraphs = justext.justext(response.content, justext.get_stoplist("English"))
for paragraph in paragraphs:
    print (paragraph.text)

0

আমি ইএইচপি ব্যবহার করব

https://github.com/iogf/ehp

এটা এখানে:

from ehp import *

doc = '''<html>
<head>Heading</head>
<body attr1='val1'>
    <div class='container'>
        <div id='class'>Something here</div>
        <div>Something else</div>
    </div>
</body>
</html>
'''

html = Html()
dom = html.feed(doc)
for ind in dom.find('div', ('class', 'container')):
    print ind.text()

আউটপুট:

Something here
Something else

5
দয়া করে ব্যাখ্যা করুন. জনপ্রিয় বিউটিউসসপ বা এলএক্সএমএল এর উপরে আপনি কী ব্যবহার করবেন?
চেইমজি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.