2009-11-29 6 views
9

previous question के उत्तर में, कई लोगों ने सुझाव दिया कि मैं अपनी परियोजना के लिए BeautifulSoup का उपयोग करता हूं। मैं उनके दस्तावेज़ीकरण के साथ संघर्ष कर रहा हूं और मैं इसे पार्स नहीं कर सकता हूं। क्या कोई मुझे उस खंड में इंगित कर सकता है जहां मुझे इस अभिव्यक्ति को एक सुंदर सूप अभिव्यक्ति में अनुवाद करने में सक्षम होना चाहिए?मैं इस XPath अभिव्यक्ति को सुंदर सूप में कैसे अनुवाद कर सकता हूं?

hxs.select('//td[@class="altRow"][2]/a/@href').re('/.a\w+') 

उपरोक्त अभिव्यक्ति Scrapy से है। मैं वहां से लिंक प्राप्त करने के लिए regex re('\.a\w+')td class altRow पर लागू करने का प्रयास कर रहा हूं।

मैं किसी अन्य ट्यूटोरियल या दस्तावेज़ीकरण के लिए पॉइंटर्स की भी सराहना करता हूं। मुझे कोई नहीं मिला।

आपकी मदद के लिए धन्यवाद।

संपादित करें: मैं इस page तलाश में हूं:, फिर भी

>>> soup.head.title 
<title>White & Case LLP - Lawyers</title> 
>>> soup.find(href=re.compile("/cabel")) 
>>> soup.find(href=re.compile("/diversity")) 
<a href="/diversity/committee">Committee</a> 

यदि आप पृष्ठ स्रोत "/cabel" को देखो है:

<td class="altRow" valign="middle" width="34%"> 
<a href='/cabel'>Abel, Christian</a> 

किसी कारण से, खोज परिणाम नहीं हैं सुंदर सूप को दिखाई नहीं दे रहा है, लेकिन वे XPath के लिए दृश्यमान हैं क्योंकि hxs.select('//td[@class="altRow"][2]/a/@href').re('/.a\w+') कैच "/ कैबेल"

संपादित करें: कोबबल: यह अभी भी काम नहीं कर रहा है। लेकिन जब मैं इसे खोजता हूं:

>>>soup.findAll(href=re.compile(r'/.a\w+')) 
[<link href="/FCWSite/Include/styles/main.css" rel="stylesheet" type="text/css" />, <link rel="shortcut icon" type="image/ico" href="/FCWSite/Include/main_favicon.ico" />, <a href="/careers/northamerica">North America</a>, <a href="/careers/middleeastafrica">Middle East Africa</a>, <a href="/careers/europe">Europe</a>, <a href="/careers/latinamerica">Latin America</a>, <a href="/careers/asia">Asia</a>, <a href="/diversity/manager">Diversity Director</a>] 
>>> 

यह दूसरे चरित्र "ए" के साथ सभी लिंक देता है लेकिन वकील के नाम नहीं। तो किसी कारण से उन लिंक (जैसे "/ cabel") सुंदर सूप के लिए दृश्यमान नहीं हैं। मुझे समझ में नहीं आता क्यों।

+0

क्या आपने सिंगल कोट्स के बजाय डबल-कोट्स की कोशिश की है: '...'। – jfs

+0

जहां तक ​​मैं कह सकता हूं, सुंदर सूप पृष्ठ को सही ढंग से पार्स नहीं कर रहा है, soup.contents टैग के बाद कुछ भी नहीं देता है < 'जो दस्तावेज़ की शुरुआत की ओर है। – cobbal

उत्तर

3

मुझे पता है कि सुंदर सूप कैनोनिकल एचटीएमएल पार्सिंग मॉड्यूल है, लेकिन कभी-कभी आप कुछ HTML से कुछ सबस्ट्रिंग्स को स्क्रैप करना चाहते हैं, और पाइपर्सिंग में ऐसा करने के लिए कुछ उपयोगी तरीके हैं।

from pyparsing import makeHTMLTags, withAttribute, SkipTo 
import urllib 

# get the HTML from your URL 
url = "http://www.whitecase.com/Attorneys/List.aspx?LastName=&FirstName=" 
page = urllib.urlopen(url) 
html = page.read() 
page.close() 

# define opening and closing tag expressions for <td> and <a> tags 
# (makeHTMLTags also comprehends tag variations, including attributes, 
# upper/lower case, etc.) 
tdStart,tdEnd = makeHTMLTags("td") 
aStart,aEnd = makeHTMLTags("a") 

# only interested in tdStarts if they have "class=altRow" attribute 
tdStart.setParseAction(withAttribute(("class","altRow"))) 

# compose total matching pattern (add trailing tdStart to filter out 
# extraneous <td> matches) 
patt = tdStart + aStart("a") + SkipTo(aEnd)("text") + aEnd + tdEnd + tdStart 

# scan input HTML source for matching refs, and print out the text and 
# href values 
for ref,s,e in patt.scanString(html): 
    print ref.text, ref.a.href 

मैं अपने पृष्ठ से 914 संदर्भ निकाला, हाबिल से Zupikova: इस कोड का उपयोग करना।

Abel, Christian /cabel 
Acevedo, Linda Jeannine /jacevedo 
Acuña, Jennifer /jacuna 
Adeyemi, Ike /igbadegesin 
Adler, Avraham /aadler 
... 
Zhu, Jie /jzhu 
Zídek, Aleš /azidek 
Ziółek, Agnieszka /aziolek 
Zitter, Adam /azitter 
Zupikova, Jana /jzupikova 
+0

मैं निश्चित रूप से पाइपर्सिंग का प्रयास करूंगा। यह सुंदर सूप की तुलना में मेरे लिए अधिक समझ में आता है। – Zeynel

6

एक ही विकल्प lxml उपयोग करने के लिए (मैं BeautifulSoup से परिचित नहीं हूँ, इसलिए मैं इसके साथ कैसे करना है यह नहीं कह सकते हैं), यह defaultly का समर्थन करता है XPath

संपादित करें:
कोशिश (अपरीक्षित) परीक्षण किया:

soup.findAll('td', 'altRow')[1].findAll('a', href=re.compile(r'/.a\w+'), recursive=False) 

मैं http://www.crummy.com/software/BeautifulSoup/documentation.html पर डॉक्स इस्तेमाल किया

सूप एक BeautifulSoup निष्पक्ष होना चाहिए टी

import BeautifulSoup 
soup = BeautifulSoup.BeautifulSoup(html_string) 
+0

मैं इस विंडोज इंस्टॉलेशन की प्रतीक्षा नहीं कर रहा हूं http://codespeak.net/lxml/installation.html अगर मैं इससे बच सकता हूं। अन्यथा BeautifulSoup (प्रलेखन वार) – Zeynel

+0

की तुलना में बहुत अच्छे बी एस प्रलेखन से दिखता है: यहाँ सूप नेविगेट करने के लिए कुछ तरीके हैं: soup.contents [0] .name # u'html ' जब मैं कोशिश, मैं मिलती है: soup.contents [0] .name Traceback (सबसे हाल कॉल पिछले): फ़ाइल "", लाइन 1, soup.contents में [0] .name फ़ाइल "C: \ Python26 \ BeautifulSoup.py ", लाइन 427, __getattr__ में विशेषताएँ एंटर करें,"% s 'ऑब्जेक्ट में कोई विशेषता नहीं है'% s '"% (self .__ class __.__ nam e__, attr) विशेषताएँ त्रुटि: 'NavigableString' ऑब्जेक्ट में कोई विशेषता नहीं है 'name' – Zeynel

1

ऐसा लगता है कि आप उपयोग कर रहे BeautifulSoup 3.1

मैं 3.0.7 (this problem की वजह से) BeautifulSoup को

परिणाम

मैं सिर्फ 3.0.7 के साथ परीक्षण किया और मिल गया जैसा कि आप उम्मीद को पूर्ववत करने की सलाह देते हैं :

>>> soup.findAll(href=re.compile(r'/cabel')) 
[<a href="/cabel">Abel, Christian</a>] 

सुंदर सूप 3.1 के साथ परीक्षण करने वाले परिणाम आपको मिलते हैं। एचटीएमएल में शायद एक विकृत टैग है लेकिन मुझे नहीं पता था कि यह एक त्वरित रूप में क्या था।

2

मैंने ज्योनेल के ईमेल की सूची में प्रतिक्रिया के रूप में सुंदर सूप मेलिंग सूची पर इसका उत्तर दिया। असल में, वेब पेज में एक त्रुटि है जो पार्सिंग के दौरान पूरी तरह से सुंदर सूप 3.1 को मार देती है, लेकिन केवल सुंदर सूप 3.0 द्वारा उलझा हुआ है।

धागा Google Groups archive पर स्थित है।

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