在搜索栏中输入值并从网页下载输出

时间:2016-06-20 15:48:07

标签: html web-scraping

我试图搜索网页(http://www.phillyhistory.org/historicstreets/)。我认为相关的源代码html是这样的:

<input name="txtStreetName" type="text" id="txtStreetName">

您可以在网站上看到其他源HTML。我想进入该文本框并输入街道名称并下载输出(即在页面的搜索框中输入&#39; Jefferson&#39;并查看Jefferson的历史街道名称)。我尝试过使用requests.post,并尝试在url中键入?get = Jefferson来测试它是否运行正常。任何人有任何想法如何获得此页面?谢谢,

卡梅伦

我目前尝试的代码(一些导入未使用,因为我打算解析等):

import requests
from bs4 import BeautifulSoup
import csv
from string import ascii_lowercase
import codecs
import os.path
import time


arrayofstreets = []



arrayofstreets = ['Jefferson']

for each in arrayofstreets:
    url = 'http://www.phillyhistory.org/historicstreets/default.aspx'
    payload = {'txtStreetName': each}
    r = requests.post(url, data=payload).content
    outfile = "raw/" + each + ".html"
    with open(outfile, "w") as code:
        code.write(r)
    time.sleep(2)

这不起作用,只给了我下载的默认网页(即杰斐逊没有进入搜索栏并检索。

1 个答案:

答案 0 :(得分:2)

我猜测你对'requests.post&#39;的推荐。与python的请求模块有关。

由于您尚未指定要从搜索结果中删除的内容,因此我只会为您提供一个代码段来获取给定搜索查询的html:

import requests

query = 'Jefferson'

url = 'http://www.phillyhistory.org/historicstreets/default.aspx'
post_data = {'txtStreetName': query}

html_result =  requests.post(url, data=post_data).content

print html_result

如果您需要进一步处理html文件以提取一些数据,我建议您使用Beautiful Soup模块来执行此操作。

更新版本:

    #!/usr/bin/python
import requests
from bs4 import BeautifulSoup
import csv
from string import ascii_lowercase
import codecs
import os.path
import time

def get_post_data(html_soup, query):
    view_state = html_soup.find('input', {'name': '__VIEWSTATE'})['value']
    event_validation = html_soup.find('input', {'name': '__EVENTVALIDATION'})['value']
    textbox1 = ''
    btn_search = 'Find'
    return {'__VIEWSTATE': view_state,
            '__EVENTVALIDATION': event_validation,
            'Textbox1': '',
            'txtStreetName': query,
            'btnSearch': btn_search
            }

arrayofstreets = ['Jefferson']


url = 'http://www.phillyhistory.org/historicstreets/default.aspx'
html = requests.get(url).content
for each in arrayofstreets:
        payload = get_post_data(BeautifulSoup(html, 'lxml'), each)
        r = requests.post(url, data=payload).content
        outfile = "raw/" + each + ".html"
        with open(outfile, "w") as code:
            code.write(r)
            time.sleep(2)

我/您的第一个版本中的问题是我们没有发布所有必需的参数。要找出您需要发送的内容,请在浏览器中打开网络监视器(在Firefox中按Ctrl + Shitf + Q),然后按照正常情况进行搜索。如果您在网络日志中选择了POST请求,则右侧会显示&#39; parameters选项卡&#39;您浏览器发送的帖子参数的位置。

enter image description here