2011-12-04 17 views
11

मेरा पायथन स्तर नौसिखिया है। मैंने कभी भी वेब स्क्रैपर या क्रॉलर नहीं लिखा है। मैंने एक एपीआई से कनेक्ट करने के लिए एक पायथन कोड लिखा है और जो डेटा मैं चाहता हूं उसे निकालने के लिए। लेकिन कुछ निकाले गए डेटा के लिए मैं लेखक का लिंग प्राप्त करना चाहता हूं। मुझे यह वेबसाइट http://bookblog.net/gender/genie.php मिली लेकिन डाउनसाइड एक एपीआई उपलब्ध नहीं है। मैं सोच रहा था कि पेज में फॉर्म में डेटा जमा करने के लिए एक पाइथन कैसे लिखना है और रिटर्न डेटा निकालना है। अगर मैं इस पर कुछ मार्गदर्शन प्राप्त कर सकता हूं तो यह एक बड़ी मदद होगी।वेब फ़ॉर्म के माध्यम से डेटा सबमिट करें और परिणाम निकालें

<form action="analysis.php" method="POST"> 
<textarea cols="75" rows="13" name="text"></textarea> 
<div class="copyright">(NOTE: The genie works best on texts of more than 500 words.)</div> 
<p> 
<b>Genre:</b> 
<input type="radio" value="fiction" name="genre"> 
fiction&nbsp;&nbsp; 
<input type="radio" value="nonfiction" name="genre"> 
nonfiction&nbsp;&nbsp; 
<input type="radio" value="blog" name="genre"> 
blog entry 
</p> 
<p> 
</form> 

परिणाम पृष्ठ डोम:

<p> 
<b>The Gender Genie thinks the author of this passage is:</b> 
male! 
</p> 

उत्तर

22

मशीनीकरण का उपयोग करने की कोई आवश्यकता नहीं है, बस एक POST अनुरोध में सही फॉर्म डेटा भेजें।

इसके अलावा, HTML को पार्स करने के लिए नियमित अभिव्यक्ति का उपयोग करना एक बुरा विचार है। आप एक HTML पार्सर जैसे lxml.html का उपयोग करना बेहतर होगा।

import requests 
import lxml.html as lh 


def gender_genie(text, genre): 
    url = 'http://bookblog.net/gender/analysis.php' 
    caption = 'The Gender Genie thinks the author of this passage is:' 

    form_data = { 
     'text': text, 
     'genre': genre, 
     'submit': 'submit', 
    } 

    response = requests.post(url, data=form_data) 

    tree = lh.document_fromstring(response.content) 

    return tree.xpath("//b[text()=$caption]", caption=caption)[0].tail.strip() 


if __name__ == '__main__': 
    print gender_genie('I have a beard!', 'blog') 
+0

मैंने easy_install lxml.html करने की कोशिश की लेकिन निम्न त्रुटि को आसान बना रहा है lxml.html lxml.html के लिए खोज http://pypi.python.org/simple/lxml .html/ 'lxml.html' के लिए इंडेक्स पेज नहीं मिला (शायद गलत वर्तनी?) सभी पैकेजों की स्कैनिंग इंडेक्स (इसमें कुछ समय लग सकता है) पढ़ना http://pypi.python.org/simple/ नहीं lxml.html त्रुटि के लिए स्थानीय संकुल या डाउनलोड लिंक पाए गए: Requirement.parse ('lxml.html') –

+1

के लिए उपयुक्त वितरण नहीं मिला मॉड्यूल आयात में, यदि दो नामों के बीच '.' है, तो इसका मतलब है कि दूसरा नाम पिछले नाम के भीतर है। जिस मॉड्यूल को आप इंस्टॉल करना चाहते हैं वह lxml है। – Acorn

+0

धन्यवाद टिप्पणी देने के बाद मुझे एहसास हुआ। धन्यवाद agianl –

1

आप mechanize उपयोग कर सकते हैं, जानकारी के लिए examples देख

यह फार्म डोम है।

from mechanize import ParseResponse, urlopen, urljoin 

uri = "http://bookblog.net" 

response = urlopen(urljoin(uri, "/gender/genie.php")) 
forms = ParseResponse(response, backwards_compat=False) 
form = forms[0] 

#print form 

form['text'] = 'cheese' 
form['genre'] = ['fiction'] 

print urlopen(form.click()).read() 
+0

उत्तर के लिए बहुत बहुत धन्यवाद। machanize की तरह लगता है कि एक मॉड्यूल स्थापित है? टर्मिनल पर जल्दी परीक्षण किया गया कोई मॉड्यूल त्रुटि नहीं मिली। मैं मैक नहीं हूं, क्या मुझे machanize प्राप्त करने के लिए easy_install करना चाहिए। –

+0

ओह, ठीक है, यह एक बाहरी मॉड्यूल है। हां, आप easy_install मशीनीकरण कर सकते हैं। –

15

आप mechanize का उपयोग सबमिट करें और सामग्री प्राप्त करने में कर सकते हैं और प्राप्त करने के लिए re मॉड्यूल आप क्या चाहते हैं। उदाहरण के लिए, नीचे दी गई स्क्रिप्ट आपके अपने प्रश्न के पाठ के लिए करती है:

import re 
from mechanize import Browser 

text = """ 
My python level is Novice. I have never written a web scraper 
or crawler. I have written a python code to connect to an api and 
extract the data that I want. But for some the extracted data I want to 
get the gender of the author. I found this web site 
http://bookblog.net/gender/genie.php but downside is there isn't an api 
available. I was wondering how to write a python to submit data to the 
form in the page and extract the return data. It would be a great help 
if I could get some guidance on this.""" 

browser = Browser() 
browser.open("http://bookblog.net/gender/genie.php") 

browser.select_form(nr=0) 
browser['text'] = text 
browser['genre'] = ['nonfiction'] 

response = browser.submit() 

content = response.read() 

result = re.findall(
    r'<b>The Gender Genie thinks the author of this passage is:</b> (\w*)!', content) 

print result[0] 

यह क्या करता है? यह एक mechanize.Browser बनाता है और दिए गए URL को जाता है:

browser = Browser() 
browser.open("http://bookblog.net/gender/genie.php") 

तो यह प्रपत्र का चयन करता है (के बाद से वहाँ केवल एक ही प्रपत्र भरा जाता है, यह पहली हो जाएगा):

browser.select_form(nr=0) 

इसके अलावा, यह प्रपत्र की प्रविष्टियों सेट ...

browser['text'] = text 
browser['genre'] = ['nonfiction'] 

... और उसे सबमिट करें:

response = browser.submit() 

अब, हम परिणाम प्राप्त:

content = response.read() 

हम जानते हैं कि परिणाम के रूप में है:

<b>The Gender Genie thinks the author of this passage is:</b> male! 

तो हम मिलान के लिए एक regex बनाने और उपयोग re.findall():

result = re.findall(
    r'<b>The Gender Genie thinks the author of this passage is:</b> (\w*)!', 
    content) 

अब परिणाम आपके उपयोग के लिए उपलब्ध है:

print result[0] 
+0

बहुत बहुत धन्यवाद यह एक महान बी के लिए एक शानदार जवाब है जैसे मुझे महान स्पष्टीकरण।इच्छा है कि मैं एक से अधिक बार ऊपर उठा सकता हूं ..;) –

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