পাইথনে এক্সপাথ কীভাবে ব্যবহার করবেন?


224

এক্সপ্যাথকে সমর্থন করে এমন লাইব্রেরি কি? একটি পূর্ণ বাস্তবায়ন আছে? গ্রন্থাগারটি কীভাবে ব্যবহৃত হয়? এর ওয়েবসাইট কোথায়?


4
আমার এই চুপিচুপি সন্দেহ আছে যে এই প্রশ্নের উত্তরগুলি এখন কিছুটা বাসি।
ওয়ারেন পি

4
@ Gringo-suave এর উত্তর দেখতে ভাল আপডেট লাগছে। stackoverflow.com/a/13504511/1450294
মাইকেল শ্যাপার


@ ওয়ারেনপি যেমন বলেছে, এখানে বেশিরভাগ উত্তর হ'ল পুরানো পাইথন -২.x, সত্যিই পুরানো। হতে পারে এই প্রশ্নটি পাইথন
-২.x

উত্তর:


129

libxML2 এর অনেকগুলি সুবিধা রয়েছে:

  1. থেকে সম্মতি বৈশিষ্ট
  2. সক্রিয় উন্নয়ন এবং একটি সম্প্রদায়ের অংশগ্রহণ
  3. গতি. এটি সত্যিকারের সি বাস্তবায়নের চারপাশে একটি অজগর র‍্যাপার।
  4. সর্বব্যাপিতা। LibxML2 গ্রন্থাগারটি বিস্তৃত এবং এইভাবে ভাল পরীক্ষা করা হয়েছে।

ডাউনসাইড অন্তর্ভুক্ত:

  1. থেকে সম্মতি বৈশিষ্ট । এটা কঠোর। অন্যান্য লাইব্রেরিতে ডিফল্ট নেমস্পেস হ্যান্ডলিংয়ের মতো জিনিসগুলি সহজ।
  2. নেটিভ কোড ব্যবহার। আপনার অ্যাপ্লিকেশন কীভাবে বিতরণ / স্থাপন করা হবে তার উপর নির্ভর করে এটি একটি ব্যথা হতে পারে। আরপিএম উপলব্ধ যে এই ব্যথা কিছুটা স্বাচ্ছন্দ্য দেয়।
  3. ম্যানুয়াল রিসোর্স হ্যান্ডলিং। ফ্রিডোক () এবং xpathFreeContext () এ কল করার নীচে নমুনায় নোট করুন। এটি খুব পাইথোনিক নয়।

আপনি যদি সহজ পথ নির্বাচন করছেন, তবে এলিমেট্রি (যা পাইথন 2.5 এর অন্তর্ভুক্ত রয়েছে) এর সাথে লেগে থাকুন । আপনার যদি পূর্ণ বিবরণী সম্মতি বা কাঁচা গতির প্রয়োজন হয় এবং নেটিভ কোড বিতরণ মোকাবেলা করতে পারেন, libxML2 দিয়ে যান।

LibxML2 এক্সপথ ব্যবহারের নমুনা


import libxml2

doc = libxml2.parseFile("tst.xml")
ctxt = doc.xpathNewContext()
res = ctxt.xpathEval("//*")
if len(res) != 2:
    print "xpath query: wrong node set size"
    sys.exit(1)
if res[0].name != "doc" or res[1].name != "foo":
    print "xpath query: wrong node set value"
    sys.exit(1)
doc.freeDoc()
ctxt.xpathFreeContext()

এলিমেন্ট্রি ট্রিপথ ব্যবহারের নমুনা


from elementtree.ElementTree import ElementTree
mydoc = ElementTree(file='tst.xml')
for e in mydoc.findall('/foo/bar'):
    print e.get('title').text


8
অক্সে পাইথনটি ২.7.১০ ব্যবহার করে আমাকে এলিমেন্ট্রি হিসাবে আমদানি করতে হয়েছিলfrom xml.etree.ElementTree import ElementTree
বেন পেজ

কারণ এটি একটি সি র‌্যাপার, আপনি যদি
এসিএস

85

Lxml প্যাকেজ সমর্থন xPath। এটি বেশ ভালভাবে কাজ করছে বলে মনে হচ্ছে, যদিও স্ব :: অক্ষের সাথে আমার কিছুটা সমস্যা হয়েছিল। এর রয়েছে Amara, কিন্তু আমি এটা ব্যক্তিগতভাবে ব্যবহার করেন নি।


1
আমারা খুব সুন্দর, এবং সর্বদা এক্সপ্যাথের দরকার হয় না।
gatoatigrado

দয়া করে এক্সএক্সএলকে কীভাবে এক্সএলএমএল ব্যবহার করবেন সে সম্পর্কে কিছু প্রাথমিক বিবরণ যুক্ত করুন।
jpmc26

56

এখানে একটি lxML বিজ্ঞাপন মত শোনাচ্ছে। ;) এলিমেন্টটি ট্রি স্ট্যান্ডের লাইব্রেরিতে অন্তর্ভুক্ত রয়েছে। ২.6 এর নীচে এবং এর এক্সপথটি বেশ দুর্বল, তবে ২.7+ সালে অনেক উন্নতি হয়েছে :

import xml.etree.ElementTree as ET
root = ET.parse(filename)
result = ''

for elem in root.findall('.//child/grandchild'):
    # How to make decisions based on attributes even in 2.6:
    if elem.attrib.get('name') == 'foo':
        result = elem.text
        break

39

এলএক্সএমএল ব্যবহার করুন। এলএক্সএমএল libxML2 এবং libxslt এর সম্পূর্ণ শক্তি ব্যবহার করে তবে সেগুলি লাইব্রেরিতে আদি যে পাইথন বাইন্ডিংয়ের চেয়ে বেশি "পাইথোনিক" বাইন্ডিংগুলিতে জড় করে। যেমনটি এটি সম্পূর্ণ এক্সপথ 1.0 বাস্তবায়ন পায় gets নেটিভ এলেমেনট্রি এক্সপথের একটি সীমিত উপসেটটিকে সমর্থন করে, যদিও এটি আপনার প্রয়োজনের জন্য যথেষ্ট ভাল।


29

আর একটি বিকল্প পাই-ডম- এক্সপাথ, এটি মিনিডোমের সাথে নির্বিঘ্নে কাজ করে এবং খাঁটি পাইথন তাই অ্যাপিনজিনে কাজ করে।

import xpath
xpath.find('//item', doc)

2
আপনি যদি ইতিমধ্যে মিনিডোম নিয়ে কাজ করছেন তবে lxML এবং libxML2 এর চেয়ে সহজ। সুন্দরভাবে কাজ করে এবং আরও বেশি "পাইথোনিক"। contextমধ্যে findফাংশন আপনি একটি নতুন অনুসন্ধান প্রসঙ্গ হিসাবে অন্য xPath ফলাফলের ব্যবহারের অনুমতি দিন।
বেন

3
আমিও পাইগ-ডোম-এক্সপথটি প্লাগইন লেখার সাথে সাথে ব্যবহার করি কারণ এটি খাঁটি পাইথন। তবে আমি মনে করি না যে এটি আর বজায় রাখা হয়েছে, এবং এই বাগ সম্পর্কে সচেতন থাকুন ("যার নাম 'টেক্সট' এমন কোনও উপাদান অ্যাক্সেস করতে পারবেন না"): Code.google.com/p/py-dom-xpath/issues/detail?id = 8
জন Coombs

পাই-ডোম-এক্সপাথটি 2010 সালের অনেক আগে মথবাল হয়েছে বলে মনে হচ্ছে , দয়া করে কমপক্ষে আপনার উত্তরে এটি সম্পাদনা করুন।
স্মি

14

তুমি ব্যবহার করতে পার:

পাইএক্সএমএল :

from xml.dom.ext.reader import Sax2
from xml import xpath
doc = Sax2.FromXmlFile('foo.xml').documentElement
for url in xpath.Evaluate('//@Url', doc):
  print url.value

libxML2 :

import libxml2
doc = libxml2.parseFile('foo.xml')
for url in doc.xpathEval('//@Url'):
  print url.content

যখন আমি PyXML কোড চেষ্টা করুন, আমি পেয়েছিলাম ImportError: No module named extথেকেfrom xml.dom.ext.reader import Sax2
আমিনা Nuraini

9

এলিমেন্ট্রিটির সর্বশেষতম সংস্করণ এক্সপ্যাথকে বেশ ভাল সমর্থন করে। এক্সপ্যাথ বিশেষজ্ঞ না হয়ে বাস্তবায়ন পূর্ণ হয়েছে কিনা তা আমি নিশ্চিত করে বলতে পারি না তবে পাইথনে কাজ করার সময় এটি আমার বেশিরভাগ চাহিদা পূরণ করেছে। আমি এলএক্সএমএল এবং পাইএক্সএমএলও ব্যবহার করেছি এবং এট্রি খুব ভাল লাগে কারণ এটি একটি স্ট্যান্ডার্ড মডিউল।

দ্রষ্টব্য: আমি যেহেতু lxML খুঁজে পেয়েছি এবং এটি আমার জন্য পাইথনের জন্য এটি অবশ্যই সেরা এক্সএমএল লাইব। এটি এক্সপ্যাথটিও দুর্দান্তভাবে করেছে (যদিও এটি সম্ভবত সম্পূর্ণ বাস্তবায়ন নয়)।


7
এলিমেন্টরির এক্সপ্যাথ সমর্থন বর্তমানে সর্বনিম্ন ন্যূনতম। কার্যকারিতাটিতে বিশাল ব্যবধানের ছিদ্র রয়েছে, যেমন অ্যাট্রিবিউট সিলেক্টরের অভাব, কোনও ডিফল্ট অক্ষ, কোনও শিশু সূচিকা ইত্যাদি নয় etc.
জেমস ব্র্যাডি

8

আপনি সহজ ব্যবহার করতে পারেন soupparserথেকেlxml

উদাহরণ:

from lxml.html.soupparser import fromstring

tree = fromstring("<a>Find me!</a>")
print tree.xpath("//a/text()")

স্যুপপার্সার ব্যবহার করে কী পার্থক্য আসে?
প্যাডেরিক কানিংহাম

এটি কেবল একটি বিকল্প
আমিনাহ নুরাইন

7

আপনি যদি কোনও মুহূর্তে সিএসএস ব্যবহার করার ক্ষমতাটির সাথে এক্সপিএটিএইচ শক্তিটি পেতে চান তবে আপনি ব্যবহার করতে পারেন parsel:

>>> from parsel import Selector
>>> sel = Selector(text=u"""<html>
        <body>
            <h1>Hello, Parsel!</h1>
            <ul>
                <li><a href="http://example.com">Link 1</a></li>
                <li><a href="http://scrapy.org">Link 2</a></li>
            </ul
        </body>
        </html>""")
>>>
>>> sel.css('h1::text').extract_first()
'Hello, Parsel!'
>>> sel.xpath('//h1/text()').extract_first()
'Hello, Parsel!'

আমি যদি "লিঙ্ক 1" এবং "লিঙ্ক 2" পেতে চাই তবে আমার এক্সপথটি দেখতে কেমন হবে?
weefwefwqg3

1
পাঠ্যটি পাওয়ার জন্য এটি কিছুটা হওয়া উচিত//li/a/text()
eLRuLL

4

অন্য গ্রন্থাগারটি 4 স্যুইট: http://sourceforge.net/projects/foursuite/

আমি জানি না এটি কতটা অনুমানযোগ্য l তবে এটি আমার ব্যবহারের জন্য খুব ভাল কাজ করেছে। এটি পরিত্যক্ত দেখাচ্ছে।


3

পাইএক্সএমএল ভাল কাজ করে।

আপনি কোন প্ল্যাটফর্মটি ব্যবহার করছেন তা আপনি বলেননি, তবে আপনি যদি উবুন্টুতে থাকেন তবে আপনি এটি পেতে পারেন sudo apt-get install python-xml। আমি নিশ্চিত যে অন্যান্য লিনাক্স ডিস্ট্রোও রয়েছে।

আপনি যদি ম্যাকে থাকেন তবে এক্সপথ ইতিমধ্যে ইনস্টল করা আছে তবে তাৎক্ষণিকভাবে অ্যাক্সেসযোগ্য নয়। PY_USE_XMLPLUSএক্সএমএল.এক্সপথ আমদানি করার আগে আপনি আপনার পরিবেশে সেট করতে পারেন বা পাইথন উপায়ে এটি করতে পারেন:

if sys.platform.startswith('darwin'):
    os.environ['PY_USE_XMLPLUS'] = '1'

সবচেয়ে খারাপ ক্ষেত্রে আপনার নিজের এটি তৈরি করতে হতে পারে। এই প্যাকেজটি আর রক্ষণাবেক্ষণ করা হয় না তবে এটি জরিমানা তৈরি করে এবং আধুনিক ২.x পাইথনগুলির সাথে কাজ করে। বেসিক ডক্স এখানে


0

আপনি যদি এইচটিএমএল এর জন্য এটি প্রয়োজন হয় :

import lxml.html as html
root  = html.fromstring(string)
root.xpath('//meta')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.