2011-12-04 11 views
11

Mức python của tôi là Novice. Tôi chưa bao giờ viết trình thu thập dữ liệu web hoặc trình thu thập thông tin. Tôi đã viết một mã python để kết nối với một api và trích xuất dữ liệu mà tôi muốn. Nhưng đối với một số dữ liệu được trích xuất, tôi muốn có được giới tính của tác giả. Tôi tìm thấy trang web này http://bookblog.net/gender/genie.php nhưng nhược điểm là không có một api có sẵn. Tôi đã tự hỏi làm thế nào để viết một con trăn để gửi dữ liệu đến các hình thức trong trang và trích xuất dữ liệu trả về. Nó sẽ là một trợ giúp lớn nếu tôi có thể nhận được một số hướng dẫn về điều này.Gửi dữ liệu qua biểu mẫu web và trích xuất kết quả

Đây là dạng dom:

<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> 

kết quả trang dom:

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

Trả lời

22

Không cần phải sử dụng cơ giới hóa, chỉ cần gửi dữ liệu biểu mẫu chính xác trong yêu cầu POST.

Ngoài ra, sử dụng cụm từ thông dụng để phân tích HTML là một ý tưởng tồi. Bạn nên sử dụng trình phân tích cú pháp HTML như 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

tôi đã cố gắng để làm easy_install lxml.html nhưng nhận được lỗi sau đây easy_install lxml.html Tìm kiếm lxml.html Đọc http://pypi.python.org/simple/lxml .html/ Không thể tìm thấy trang chỉ mục cho 'lxml.html' (có thể sai chính tả?) Chỉ mục quét của tất cả các gói (quá trình này có thể mất một lúc) Đọc http://pypi.python.org/simple/ Không gói địa phương hoặc liên kết tải xuống được tìm thấy cho lxml.html lỗi: Không thể tìm thấy phân phối phù hợp cho Yêu cầu.parse ('lxml.html') –

+1

Trong nhập mô-đun, nếu hai tên có '.' giữa chúng, điều đó có nghĩa là tên thứ hai nằm trong tên trước đó. Mô-đun bạn muốn cài đặt là lxml. – Acorn

+0

cảm ơn tôi đã nhận ra nó sau khi đưa ra nhận xét. Cảm ơn agianl –

1

Bạn có thể sử dụng mechanize, xem examples để biết chi tiết.

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

Cảm ơn rất nhiều vì đã trả lời. âm thanh như machanize là một mô-đun tôi đã cài đặt? nhanh chóng kiểm tra trên thiết bị đầu cuối không có lỗi mô-đun. Tôi không phải là một mac, tôi có thể làm easy_install để có được machanize. –

+0

Ồ, đúng, đó là mô-đun bên ngoài. Có, bạn có thể làm cơ chế easy_install. –

15

Bạn có thể sử dụng mechanize để gửi và truy xuất nội dung và mô-đun re để nhận những gì bạn muốn. Ví dụ: tập lệnh bên dưới áp dụng cho văn bản câu hỏi của riêng bạn:

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] 

Nó làm gì? Nó tạo ra một mechanize.Browser và đi đến URL đưa ra:

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

Sau đó, nó lựa chọn hình thức (vì chỉ có một hình thức để được lấp đầy, nó sẽ là người đầu tiên):

browser.select_form(nr=0) 

Ngoài ra, nó đặt các mục có dạng ...

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

... và gửi thông tin:

response = browser.submit() 

Bây giờ, chúng tôi nhận được kết quả:

content = response.read() 

Chúng ta biết rằng kết quả là theo hình thức:

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

Vì vậy, chúng tôi tạo ra một regex cho phù hợp và sử dụng re.findall():

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

Bây giờ, kết quả có sẵn để bạn sử dụng:

print result[0] 
+0

Cảm ơn rất nhiều điều này là một câu trả lời tuyệt vời cho một b mới như tôi giải thích tuyệt vời.Chúc các bạn có thể upvote nhiều hơn một lần ..;) –