2010-12-13 17 views
8

मुझे मिल गया है एचटीएमएल है कि इस तरह प्रविष्टियों शामिल:पाइथन पुस्तकालय jQuery की तरह पाठ निष्कर्षण करने के लिए?

<div class="entry"> 
    <h3 class="foo"> 
    <a href="http://www.example.com/blog-entry-slug" 
    rel="bookmark">Blog Entry</a> 
    </h3> 
    ... 
</div> 

और मैं पाठ "ब्लॉग एंट्री 'निकालने के लिए चाहते हैं (और अन्य विशेषताओं के एक नंबर है, इसलिए मैं एक सामान्य उत्तर के लिए देख रहा हूँ) । http://code.google.com/p/soupselect/ से

from BeautifulSoup import BeautifulSoup 
import soupselect as soup 

rawsoup = BeautifulSoup(open('fname.html').read()) 

for entry in rawsoup.findAll('div', 'entry'): 
    print soup.select(entry, 'a[rel=bookmark]')[0].string.strip() 

soupselect:

jQuery में, मैं क्या करना होगा

$('.entry a[rel=bookmark]').text() 

निकटतम मैं अजगर में प्राप्त करने में सक्षम किया गया है है।

सूपसेलेक्ट पूर्ण CSS3 चयनकर्ता वाक्यविन्यास को समझ में नहीं आता है, जैसे कि jQuery करता है। क्या पाइथन में ऐसा कोई जानवर है?

उत्तर

11

आप lxml की CSSSelector कक्षा पर एक नज़र डालना चाहते हैं जो डब्ल्यू 3 सी विनिर्देश में वर्णित सीएसएस चयनकर्ताओं को लागू करने का प्रयास करता है। साइड नोट के रूप में, manyfolksrecommend एलएक्सएमएल अब सुंदर और सूप पर HTMLS XML पर प्रदर्शन के लिए, प्रदर्शन और अन्य कारणों के लिए।

मुझे लगता है कि एलएक्सएमएल का सीएसएस चयनकर्ता तत्व चयन के लिए XPath का उपयोग करता है, लेकिन हो सकता है कि आप अपने लिए प्रलेखन जांचना चाहें। Lxml के साथ आपका उदाहरण यहां दिया गया है:

>>> from lxml.cssselect import CSSSelector 
>>> from lxml.html import fromstring 
>>> html = '<div class="entry"><h3 class="foo"><a href="http://www.example.com/blog-entry-slug" rel="bookmark">Blog Entry</a></h3></div>' 
>>> h = fromstring(html) 
>>> sel = CSSSelector("a[rel=bookmark]") 
>>> [e.text for e in sel(h)] 
['Blog Entry'] 
+1

यह किसी कारण से मेरे लिए काम नहीं करता है (सेस्ट्रिंग वैध एचटीएमएल * एलओएल * लगता है), लेकिन आपके द्वारा दिए गए लिंक में से एक ने मुझे पक्की की ओर ले जाया। प्यक्वायरी के लिए प्रेरणा "अरे चलो पाइथन में jquery बनाते हैं", और मेरे प्रारंभिक परीक्षण से मैं दस्तावेज़ों को पढ़ने के बजाए jQuery के अपने ज्ञान पर भरोसा करने में सक्षम हूं (!) – thebjorn

+2

"lxml.html आयात से" विकृत एचटीएमएल – Saurav

2

कीवर्ड तर्कों का उपयोग करना वास्तव में बहुत आसान है।

>>> from BeautifulSoup import BeautifulSoup 
>>> soup = BeautifulSoup('''<div class="entry"> 
... <h3 class="foo"> 
...  <a href="http://www.example.com/blog-entry-slug" 
...  rel="bookmark">Blog Entry</a> 
... </h3> 
... ... 
... </div> 
... ''') 
>>> soup.find('div', 'entry').find(rel='bookmark').text 
u'Blog Entry' 

वैकल्पिक रूप से,

>>> for entry in soup('div', 'entry'): 
...  for bookmark in entry(rel='bookmark'): 
...   print bookmark.text 
... 
Blog Entry 

तुम भी attrs उपयोग कर सकते हैं .entry बल्कि div.entry से की एक चयनकर्ता प्रभाव:

>>> for entry in soup(attrs={'class': 'entry'}): 
...  for bookmark in entry(rel='bookmark'): 
...   print bookmark.text 
... 
Blog Entry 

(नोट सूप का सूप या भाग बुला बराबर है .findAll() पर।)

एक सूची समझ के रूप में, यह [b.text for e in soup('div', 'entry') for b in e(rel='bookmark')] है ([u'Blog Entry'] उत्पन्न करता है)।

यदि आप असली CSS3 चयनकर्ता चाहते हैं, तो मुझे सुंदर सूप के लिए ऐसी किसी भी चीज़ से अवगत नहीं है। सभी (या यदि काफी नहीं, लगभग सभी) इसे सरल घोंसले, परिस्थितियों और नियमित अभिव्यक्तियों के साथ किया जा सकता है (आप बस entry(rel=re.compile('^bookmark$')) का उपयोग कर सकते हैं)। अगर आप ऐसा कुछ चाहते हैं, तो इसे अपनी अगली परियोजना पर विचार करें! यह कोड को फ़्लैट करने और वेब लोगों के लिए इसे और अधिक समझने के लिए उपयोगी हो सकता है।

+0

यह बहुत बुरा नहीं लग रहा है। सुंदर सूप के साथ मेरी समस्या यह है कि जब भी मैं इसका उपयोग करता हूं तो मुझे इंटरफ़ेस को फिर से सीखना होगा। मैं jQuery का अधिक बार उपयोग करता हूं, यही कारण है कि मैं कुछ इसी तरह की तलाश में हूं। – thebjorn

+1

यह वास्तव में बहुत आसान है। अधिकांशतः आप जो चाहते हैं वह 'findAll (tag_name, class_name, attr1 = value) ', आदि है, मानों को सेट करने के लिए' कोई नहीं 'होने के साथ,' सेट के लिए सही ', एक मान के लिए' str' या नियमित 're.compile' से अभिव्यक्ति। फिर बस सामान्य पायथन पुनरावृत्ति संरचनाओं का उपयोग करें। यह सीएसएस चयनकर्ताओं से अलग है, लेकिन कुछ परिस्थितियों में समझना और याद रखना और अधिक शक्ति प्रदान करना मुश्किल नहीं है। –

3

आप भी पिक्चर पर एक नज़र रखना चाहते हैं। pyquery अजगर के लिए एक jquery- पुस्तकालय है। खोजें यह here

संबंधित मुद्दे