Python 通过web表单提交数据并提取结果

Python 通过web表单提交数据并提取结果,python,web-crawler,web-scraping,Python,Web Crawler,Web Scraping,我的python级别是新手。我从来没有写过网络刮板或爬虫。我已经编写了一个python代码来连接api并提取所需的数据。但对于一些提取的数据,我想得到作者的性别。我找到了这个网站http://bookblog.net/gender/genie.php但缺点是没有可用的api。我想知道如何编写python将数据提交到页面中的表单并提取返回数据。如果我能在这方面得到一些指导,那将是一个很大的帮助 这是dom的形式: <form action="analysis.php" method="POS

我的python级别是新手。我从来没有写过网络刮板或爬虫。我已经编写了一个python代码来连接api并提取所需的数据。但对于一些提取的数据,我想得到作者的性别。我找到了这个网站
http://bookblog.net/gender/genie.php
但缺点是没有可用的api。我想知道如何编写python将数据提交到页面中的表单并提取返回数据。如果我能在这方面得到一些指导,那将是一个很大的帮助

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

(注:精灵最适合500字以上的文本。)

体裁:
虚构的
纪实
博客条目

结果页面dom:

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

性别精灵认为这篇文章的作者是:
男!

您可以使用,有关详细信息,请参阅

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()
您可以使用提交和检索内容,以及获取所需内容的模块。例如,下面的脚本针对您自己问题的文本执行此操作:

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]
然后选择表格(因为只有一个表格需要填写,所以它将是第一个):

此外,它还设置表单的条目

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!
现在,结果可供您使用:

print result[0]

无需使用mechanize,只需在POST请求中发送正确的表单数据

另外,使用正则表达式解析HTML是一个坏主意。您最好使用像lxml.HTML这样的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')

非常感谢你的回复。听起来machanize是我安装的一个模块?在终端上快速测试得到无模块错误。我不是mac电脑,我应该能够轻松安装以获得machanize。哦,对了,这是一个外部模块。是的,你可以做简单的安装机械化。非常感谢这是一个像我这样的新b的极好的解释。但愿我能多投一次票……)我试图执行easy_install lxml.html,但出现以下错误easy_install lxml.html搜索lxml.html阅读无法找到“lxml.html”的索引页(可能拼写错误?)扫描所有软件包的索引(这可能需要一段时间)读取未找到lxml.html的本地包或下载链接错误:在模块导入中找不到适合Requirement.parse('lxml.html')的分发版,如果两个名称之间有
,则表示第二个名称位于前一个名称内。你想安装的模块是lxml。谢谢,我在发表评论后意识到了这一点。谢谢你,什么是方法是
POST
result = re.findall(
    r'<b>The Gender Genie thinks the author of this passage is:</b> (\w*)!',
    content)
print result[0]
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')