POST_数据后未刮取响应页面-Beautiful Soup&Python

POST_数据后未刮取响应页面-Beautiful Soup&Python,python,html,web-scraping,beautifulsoup,Python,Html,Web Scraping,Beautifulsoup,在使用以下代码将数据发布到表单后,我正在尝试刮取一个网页 import bs4 as bs import urllib.request import requests import webbrowser import urllib.parse url_for_parse = "http://demo.testfire.net/feedback.aspx" #PARSE THE WEBPAGE sauce = urllib.request.urlopen(url_for_parse).read(

在使用以下代码将数据发布到表单后,我正在尝试刮取一个网页

import bs4 as bs
import urllib.request
import requests
import webbrowser
import urllib.parse

url_for_parse = "http://demo.testfire.net/feedback.aspx"
#PARSE THE WEBPAGE
sauce = urllib.request.urlopen(url_for_parse).read()
soup = bs.BeautifulSoup(sauce,"html.parser")

#GET FORM ATTRIBUTES
form = soup.find('form')
action_value = form.get('action')
method_value = form.get('method')
id_value = form.get('id')

#POST DATA
payload = {'txtSearch':'HELLOWORLD'}
r = requests.post(url_for_parse, payload)

#PARSING ACTION VALUE WITH URL
url2 = urllib.parse.urljoin(url_for_parse,action_value)

#READ RESPONSE
response = urllib.request.urlopen(url2)
page_source = response.read()
with open("results.html", "w") as f:
    f.write(str(page_source))

searchfile = open("results.html", "r")
for line in searchfile:
    if "HELLOWORLD" in line: 
        print ("STRING FOUND")
    else:
        print ("STRING NOT FOUND")  
searchfile.close()  
代码是正确的。响应网页已成功抓取并存储在results.html中

但是,我想在执行post_数据后刮取网页。因为每次我运行代码时都会得到一个结果:String Not Found。这意味着在执行post_数据之前对结果页面进行爬网

如何修改代码以成功提交表单,然后将源代码存储在本地文件中


对于上述过程,是否建议使用一个替代框架而不是漂亮的脚本?

在您的请求后返回的响应。post调用将是您希望执行的HTML。您可以通过执行以下操作来访问它

r.content
然而,在我的测试中,它说我没有验证,所以我假设你已经验证了


我还建议完全使用请求,而不是使用urllib作为GET和POST请求。

很明显您正在做什么

1) You are posting some data to a URL
2) Scraping the same URL.
3) Check for some "String"
但是你应该做什么

1) Post data to a URL
2) Scrape the resultant page (Not the same URL) and store in the file
3) Check for some "String"
为此,您需要将r.content写入本地文件并搜索字符串

按如下方式修改代码:

 payload = {'txtSearch':'HELLOWORLD'}
 url2 = urllib.parse.urljoin(url_for_parse,action_value)
 r = requests.post(url2, auth = {"USERNAME", "PASSWORD"}, payload)

  with open("results.html", "w") as f:
        f.write(str(r.content))

//Then continue searching for a String. 

注意:您需要将有效负载发送到url2,而不是用于解析的初始URL。最好在请求中保留会话参数

这个关键点就是您正在调用并等待的内容

<form name="cmt" method="post" action="comment.aspx">

这只是一篇帖子

在上面的代码之前,我已经尝试过r.content。r.content代码段如下所示:POST DATA payload={'txtSearch':'HELLOWORLD'}r=requests.postrl_for_parse,payload with openresults.html,w为f:f.writestr.content,但输出的结果是相同的字符串not found。可能这有助于直观地解析您发布到的页面。当我试图发布到该页面时,它告诉我,我没有进行身份验证。有你?
<form name="cmt" method="post" action="comment.aspx">